【长沙集训】2017.10.10

 

Adore

1.1 问题描述

小 w 偶然间遇到了一个 DAG。 这个 DAG 有 m 层,第一层只有1个源点,最后一层只有1个汇点,剩下的每一层都有 k 个 节点。

现在小 w 每次可以取反第 i(1 < i < n − 1) 层和第 i + 1 层之间的连边。也就是把原本从 (i, k1) 连到 (i + 1, k2) 的边,变成从

(i, k2) 连到 (i + 1, k1)。 请问他有多少种取反的方案,把从源点到汇点的路径数变成偶数条? 答案对 998244353 取模。

1.2 输入格式

第一行两个整数 m, k。

接下来 m − 1 行, 第一行和最后一行有 k 个整数 0 或 1,剩下每行有 k 2 个整数 0 或 1,

第 (j − 1) × k + t 个整数表示 (i, j) 到 (i + 1, t) 有没有边。

1.3 输出格式

一行一个整数表示答案。

1.4 样例输入

5 3

1 0 1

0 1 0 1 1 0 0 0 1

0 1 1 1 0 0 0 1 1

0 1 1

1.5样例输出

4

1.6数据规模与约定

20% 的数据满足 n ≤ 10, k ≤ 2

40% 的数据满足 n ≤ 10^3 , k ≤ 2。

60% 的数据满足 m ≤ 10^3 , k ≤ 5。

100% 的数据满足 4 ≤ m ≤ 10^4 , k ≤ 10。

 1.

这要是Noip d1t1我也不用学oi了。。。

每一层只有10个点,我们只关心每个点的奇偶情况,于是可以考虑状压dp。dp[i][j]表示第i层奇偶情况为j的答案。

暴力的写法,枚举每一层,每种情况,枚举每条边暴力地更新奇偶算转移到的状态。60分。场上zz不知道哪个地方莫名多了一个忘删掉的for循环,炸了两个点。。

优化一下,预处理出连向每个点的边的集合,用一个二进制串表示,然后每次和转移来的状态取交,判断这个数的1的个数的奇偶(这一步同样是预处理)。

然后又是垃圾卡常,,可能我真的是传说中的 真·大常数选手吧。。好不容易卡进去。。

//Twenty
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<vector>
#include<cstdio>
#include<cmath>
#include<ctime>
#include<queue>
#include<stack>
typedef long long LL;
const LL mod=998244353;
const int maxn=1e4+299;
const int maxm=1e6+299;
int m,k,x,s,t;
using namespace std;
int a[maxn][11],b[maxn][11],ok[maxn];
int f[10005][1030];inline int get(int &x) {int ret=0; char ch=getchar();while(ch<'0'||ch>'9') ch=getchar();for(;ch>='0'&&ch<='9';ch=getchar()) ret=ret*10+ch-'0';x=ret;
}void work() {int nn=(1<<k)-1;for(register int i=0;i<=nn;i++) ok[i]=ok[i>>1]^(i&1);for(register int i=3;i<=m;i++) {for(register int j=0;j<=nn;j++)  if(f[i-1][j]){int now=0,s1=0,s2=0;for(register int l=1;l<=k;l++) {s1|=ok[a[i][l]&j]<<l-1;s2|=ok[b[i][l]&j]<<l-1;}f[i][s1]+=f[i-1][j];if(f[i][s1]>=mod) f[i][s1]-=mod;if(i!=m) {f[i][s2]+=f[i-1][j];if(f[i][s2]>=mod) f[i][s2]-=mod;}}}
}int main()
{freopen("adore.in","r",stdin);freopen("adore.out","w",stdout);get(m); get(k);int now=0;for(register int i=1;i<=k;i++) {get(x);if(!x) continue;now|=(1<<i-1);}f[2][now]=1;for(register int i=2;i<m-1;i++) {for(register int j=1;j<=k;j++)for(register int l=1;l<=k;l++) {get(x);if(!x) continue;a[i+1][l]|=(1<<j-1);b[i+1][j]|=(1<<l-1);}}for(register int i=1;i<=k;i++) {get(x);if(!x) continue;a[m][1]|=(1<<i-1);}work();printf("%d\n",f[m][0]);fclose(stdin);fclose(stdout);return 0;
}
View Code

 

 

Confess

2.1 问题描述

小w 隐藏的心绪已经难以再隐藏下去了。 小w 有 n + 1(保证 n 为偶数) 个心绪,每个都包含了 [1, 2n] 的一个子集。 现在他要找到隐藏的任意两个心绪,使得他们的交大于等于 n/ 2。

2.2 输入格式

一行一个整数 n。

接下来每行一个长度为 k 的字符串,该字符串是一个 64 进制表示,

ASCII 码为 x 的字符代 表着 x − 33,所有字符在 33 到 33 + 63 之间。

转为二进制表示有 6k 位,它的前 2n 个字符就是读入的集合,

第 i 位为 1 表示这个集合包 含 i,为 0 表示不包含。

2.3 输出格式

一行两个不同的整数表示两个集合的编号。

如果无解输出”NO Solution”。

2.4 样例输入

10

EVK#

IH=#

676"

R7,#

74S"

6V2#

O3J#

S-7$

NU5"

C[$$

3N.#

2.5 样例输出

1 2

2.6 数据规模与约定

对于 20% 的数据满足 n ≤ 100。

对于 50% 的数据满足 n ≤ 1 × 10^3。

对于 100% 的数据满足 n ≤ 6 × 10^3。

 2.

t1写得太难受+语文太烂,没读懂题,暴力都没打直接输出no solution。

然而没有No solution的情况,正解就是暴力。

首先”NO Solution” 两个单词大小写不一致,所以肯定是乱 打的,不会有无解。

证明?我们不妨算一算如果随机选两个集合,他们交的期望

min( ∑2n i=1 C(ci ,2) C(n+1,2) | ∑2n i=1 ci = n(n + 1)) = n−1/2

注意 n 是偶数,所以大于 n−2/2 即可说明会有交为 n 的

由于大了一个常数,所以至少有 n 对!

随机 O(n) 对即可

标解用了bitset,开O2跑得贼快,不用bitset就又是垃圾卡常,怎么卡都卡不进,只能一边输一遍做找到答案就输都不输了才ok。。。

//Twenty
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<vector>
#include<cstdio>
#include<cmath>
#include<ctime>
#include<queue>
using namespace std;
const int maxn=6e3+5;
int n,sz,b[maxn];
char ch[60005];
bool a[maxn][2*maxn],tp[10];
int ok(int x,int y) {int ret=0;for(int i=1;i<=2*n;i++) {if(a[x][i]==1&&a[y][i]==1) ret++;if(ret>=n/2) return 1;}return ret>=n/2;
}
int main()
{freopen("confess.in","r",stdin);freopen("confess.out","w",stdout);scanf("%d",&n);for(register int i=1;i<=n+1;i++) {cin>>ch;int p=0,q=0;while(q<=2*n){int mid=ch[p++]-33;for(int j=0;j<6;j++)a[i][++q]=mid&(1<<j);} for(register int j=i-1;j>=1;j--) if(ok(i,j)) {printf("%d %d\n",i,j);return 0;}}fclose(stdin);fclose(stdout);return 0;
}
View Code

--------------------------------------------------------------------------------------------

事实证明被卡常是某个叫random_shuffle()的函数的锅。换成sort就过了。

还有getchar会比cin快很多。常数这种东西太可怕了。

//Twenty
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<vector>
#include<cstdio>
#include<cmath>
#include<ctime>
#include<queue>
using namespace std;
const int maxn=6e3+5;
int n,sz,b[maxn],c[maxn];
char s[105];
bool a[maxn][2*maxn],tp[10];
int ok(int x,int y) {int ret=0;for(int i=1;i<=2*n;i++) {if(a[x][i]==1&&a[y][i]==1) ret++;if(ret>=n/2) return 1;}return ret>=n/2;
}bool cmp(const int &x,const int &y) {return b[x]<b[y];
}int main()
{freopen("confess.in","r",stdin);freopen("confess.out","w",stdout);srand(time(0));cin>>n;for(int i=1;i<=n+1;i++) {int tot=0; char c=getchar();while(c<33||c>96)c=getchar();while(c>=33&&c<=96) {for(int j=0;j<=5&&tot<=2*n;j++)a[i][++tot]=(((c-33)>>j)&1);c=getchar();}}for(int i=1;i<=n+1;i++)  c[i]=i,b[i]=rand();sort(c+1,c+n+2,cmp);for(int i=1;i<=n+1;i++) {for(int j=i+1;j<=n+1;j++)if(ok(c[i],c[i+1])) {printf("%d %d\n",c[i],c[i+1]);return 0;}}fclose(stdin);fclose(stdout);return 0;
}
View Code

 

 

 Repulsed

3.1 问题描述

小 w 心理的火焰就要被熄灭了。 简便起见,假设小w 的内心是一棵 n − 1 条边,n 个节点的树。 现在你要在每个节点里放一些灭火器,每个节点可以放任意多个。 接下来每个节点都要被分配给一个最多 k 条边远的灭火器,每个灭火器最多能分配给 s 个节 点。 最少要多少个灭火器才能让小 w 彻底死心呢?

3.2 输入格式

第一行三个整数 n, s, k。

接下来 n − 1 行每行两个整数表示一条边。

3.3 输出格式

一行一个整数表示答案

3.4 样例输入

10 10 3

1 8

2 3

1 5

2 4

1 2

8 9

8 10

5 6

5 7

3.5 样例输出

1

3.6 数据规模与约定

对于 20% 的数据满足 n ≤ 100, k ≤ 2。

对于另外 20% 的数据满足 k = 1。

对于另外 20% 的数据满足 s = 1。

对于 100% 的数据满足 n ≤ 10^5 , k ≤ 20, s ≤ 10

 至底往上贪心。

考虑一条链上去只要能管得到肯定往上放比较优,每次从下到上再在上面考虑下面的情况。

g[x][i]表示x点往下i的距离的位置还需要多少灭火器,f[x][i]表示x点往下i的距离的位置有多少没用的灭火器。

若g[x][k]还不为0,则在该点放灭火器。

考虑子树中长度为k的距离的位置和k-1距离的位置的互相配放。

到根节点后再把没用的全用了,还差的一起补上。

//Twenty
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<vector>
#include<cstdio>
#include<cmath>
#include<ctime>
#include<queue>
const int maxn=1e5+299;
int n,s,k;
using namespace std;int ans,ecnt,fir[maxn],nxt[maxn*2],to[maxn*2];
void add(int u,int v) {nxt[++ecnt]=fir[u]; fir[u]=ecnt; to[ecnt]=v;nxt[++ecnt]=fir[v]; fir[v]=ecnt; to[ecnt]=u;
}int f[maxn][22],g[maxn][22];
void dfs(int x,int fa) {for(int i=fir[x];i;i=nxt[i]) if(to[i]!=fa){int v=to[i]; dfs(v,x);for(int j=1;j<=k;j++) {f[x][j]=min(n,f[x][j]+f[v][j-1]);g[x][j]+=g[v][j-1];} }g[x][0]++;if(g[x][k]) {int tp=(g[x][k]-1)/s+1;f[x][0]=tp*s,ans+=tp;}for(int i=0;i<=k;i++) {int j=k-i;int d=min(f[x][i],g[x][j]);f[x][i]-=d; g[x][j]-=d;}for(int i=0;i<k;i++) {int j=k-i-1;int d=min(f[x][i],g[x][j]);f[x][i]-=d; g[x][j]-=d;}
}int main()
{freopen("repulsed.in","r",stdin);freopen("repulsed.out","w",stdout);scanf("%d%d%d",&n,&s,&k);for(int i=1;i<n;i++) {int x,y;scanf("%d%d",&x,&y);add(x,y);}dfs(1,0);for(int i=0;i<=k;i++)for(int j=0;j<=k;j++) {if(i+j<=k) {int d=min(f[1][i],g[1][j]);f[1][i]-=d; g[1][j]-=d;}}int tot=0;for(int i=0;i<=k;i++) {if(g[1][i]) tot+=g[1][i];}ans+=(tot?(tot-1)/s+1:0);printf("%d\n",ans);fclose(stdin);fclose(stdout);return 0;
}
View Code

 

转载于:https://www.cnblogs.com/Achenchen/p/7647431.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/467552.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

elasticsearch mongodb mysql_Elasticsearch 与 Mongodb 数据同步问题

1、mongo-connector工具首先安装python环境wget http://www.python.org/ftp/python/3.0.1/Python-3.0.1.tgztar -zxvf Python-3.0.1.tgzcd Python-3.0.1./configuremake allmake install看来新装的版本生效了&#xff0c;做个软连接应该就OK。ln -s /usr/local/bin/python3.0 /…

Linux中断子系统之Workqueue

背景说明Kernel版本&#xff1a;4.14ARM64处理器&#xff0c;Contex-A53&#xff0c;双核使用工具&#xff1a;Source Insight 3.5&#xff0c; Visio1. 概述Workqueue工作队列是利用内核线程来异步执行工作任务的通用机制&#xff1b;Workqueue工作队列可以用作中断处理的Bott…

python3一个简单的网页抓取

python3一个简单的网页抓取 都是学PYTHON。怎么学都是学&#xff0c;按照基础学也好&#xff0c;按照例子增加印象也好&#xff0c;反正都是学 import urllib import urllib.requestdata{} data[word]baker95935url_valuesurllib.parse.urlencode(data) url"http://www.ba…

给你准备的Linux启动流程

读者朋友提问&#xff1a; 昨天在后台看到一个读者朋友跟我说&#xff0c;发哥&#xff0c;你能不能讲一下嵌入式Linux的开机流程&#xff0c;然后我看了下&#xff0c;我是没有写过这方面的文章&#xff0c;所以&#xff0c;就有了这篇文章。回答&#xff1a;我们都知道pc指针…

[linux]服务器apache配置vhost

官网示例&#xff1a; http://httpd.apache.org/docs/current/vhosts/examples.html转载于:https://www.cnblogs.com/oDoraemon/p/7650748.html

java dao 单元测试_Spring Service、Dao进行Junit单元测试

pring对Controller、Service、Dao进行Junit单元测试总结​ 所有用Junit进行单元测试&#xff0c;都需要下面的配置RunWith(SpringJUnit4ClassRunner.class)ContextConfiguration(locations {"classpath:applicationContext.xml"})​ applicationContext.xml 是整个项…

Linus Torvalds:我们都老了,但Linux维护者真的很难找

Linux 之父Linus Torvalds非常担忧没人继续维护内核「真的很难找到维护者&#xff01;」在本周召开的Linux开源峰会与嵌入式大会上&#xff0c; VMware的首席开放源代码官Dirk Hohndel和Linux的创建者Linus Torvalds再次就Linux开发展开了远程对话讨论。左&#xff1a;Dirk Ho…

判断线程结束

判断线程结束 使用ExecutorService.isTerminated方式 public void executor() throws InterruptedException{ExecutorService executorService Executors.newFixedThreadPool(threadNum);List<Callable<Object>> calls new ArrayList<>();for (int i 0; …

java map扩容机制_java中ConcurrentHashMap的扩容机制是怎样的?详细解析

大家都知道java中有很多的基础知识&#xff0c;需要大家花费一定的时间去消化。关于java中ConcurrentHashMap的扩容机制不知道大家是否了解过&#xff0c;其实内容也是很好理解的&#xff0c;一起来看看吧。首先&#xff0c;我们需要知道的是&#xff1a;1. 计算每个线程可以处…

看printk引发的一点思考

在源码位置kernel/printk/函数原型asmlinkage __visible int printk(const char *fmt, ...) {printk_func_t vprintk_func;va_list args;int r;va_start(args, fmt);/** If a caller overrides the per_cpu printk_func, then it needs* to disable preemption when calling pr…

寄语

寄语&#xff1a; 前面漆黑一片&#xff0c;什么都看不到。 也不是&#xff0c;天亮后就会很美的。转载于:https://www.cnblogs.com/doudou-taste/p/7660997.html

我毕业时候写的简历

写简历这个事情&#xff0c;一直是一个非常让人头疼的&#xff0c;在我看来&#xff0c;写简历并不是一件简单的事情&#xff0c;所以&#xff0c;现在是晚上一点钟&#xff0c;我倒腾了一个晚上&#xff0c;才有了这篇文章。我认为写简历有几个需要注意的地方&#xff0c;不啰…

idea java 非法字符_解决IDEA显示非法字符 \ufeff 的问题

一、问题在txt文本中复制代码进入IDEA报错Error:(1, 1) java: 非法字符: ‘\ufeffError:(1, 10) java: 需要class, interface或enum二、解决办法用IDEA转换&#xff0c;先转换为GBK&#xff0c;再转回UTF-8()补充知识&#xff1a;Eurake问题Failed to bind properties under eu…

css 单行/多行文字垂直居中问题

例子可以直接看这里 http://www.zhangxinxu.com/study/200911/line-height-text-v-center.html 这篇文章中有一点点解释 http://blog.csdn.net/hdchangchang/article/details/47086565 这一篇提出了一个新想法 http://caibaojian.com/css-vertical-middle.html 总的来说&#x…

Linux 内核完成接口

Linux 内核里面有一个函数wait_for_completion&#xff0c;这是一个内核同步机制的函数&#xff0c;同步机制如果是早期的读者应该看过我发的文章&#xff0c;如果没有看过的可以看看Linux 专辑文章里面找找。既然是同步机制&#xff0c;主要的工作就是调用了这个函数&#xff…

java 换行符 常量_6.java常量

Java中常量的分类&#xff1a;整数常量 &#xff1a; 所有整数小数常量 &#xff1a; 所有小数布尔常量 &#xff1a; 只有true和false字符常量 &#xff1a;使用’’引起来的单个字符字符串常量 &#xff1a;使用“”引起来的字符序列&#xff0c;“” 、“a” 、” ”null常…

关于测试

这是5月份和公司同仁做的分享&#xff0c;分享主题是关于测试&#xff0c;是我自己对于测试的一些认知&#xff0c;以及态度的转变。 目录 以怎样的心态面对测试 安全测试贯穿整个软件生命周期 总结 以怎样的心态面对测试 提问大家几个小问题&#xff1a; 你喜欢测试吗&#…

涨疯了,历史总是如此相似

2015年的股市&#xff0c;如果你经历过&#xff0c;那你一定会记忆犹新。最近的股市太猛了&#xff0c;写一篇文章纪念一下~mark上周五&#xff0c;在一个炎热的晚上&#xff0c;我跟4个股神在深圳坪洲的某个火锅店相遇&#xff0c;虽然他们都是富甲一方的富豪&#xff0c;虽然…

java基础语句_【Java基础-Java语言基础】

知识点&#xff1a;1.关键字  2.标识符  3.变量和常量一、关键字1.Java中的关键字有很多一共53个关键字有两个是保留字(java的关键字都是小写的&#xff01;&#xff01;)2.Java中的保留字(1)const  常量&#xff0c;数量(2)goto   转到3.Java的关键字(1)访问修饰符的关…

【BZOJ3514】Codechef MARCH14 GERALD07加强版 LCT+主席树

【BZOJ3514】Codechef MARCH14 GERALD07加强版 Description N个点M条边的无向图&#xff0c;询问保留图中编号在[l,r]的边的时候图中的联通块个数。 Input 第一行四个整数N、M、K、type&#xff0c;代表点数、边数、询问数以及询问是否加密。接下来M行&#xff0c;代表图中的每…