csp-s模拟测试86

A. 异或

上来先把除了2^k-1的部分分打满了,写的时候也一直不能集中精力,状态很迷,然后就进了T2

最后10min回来写2^k-1,然后写着写着想出了正解。。。然后就没了。。。

一般套路:按位考虑

如果固定一个数x属于[L,R],然后统计出[L,R]内每位上1的个数就可以分类按位计算答案。

发现不需要知道x具体是谁,我只需要知道所有的x(一起考虑)的01分布。

假设考虑到第i位:

1.当该位为1,能和该位为0的形成1<<i的贡献

2.当该位为0,能和该位为1的形成1<<i贡献

现在只要快速求出[L,R]内每位上1的个数。

%mzz,发现每一位上的01是有循环节的,节长为1<<i+1

求出R、L的前缀桶再相减。

扫描二维码关注公众号,回复: 7599112 查看本文章

B. 取石子

20分钟写完记搜就交了,也没有对拍,试了下极限数据跑的飞快,也没有从中发现问题。

然后就爆零了,轻敌我活该。

 1 int dfs(int a,int b,int c)
 2 {
 3     if(~f[a][b][c])return f[a][b][c];
 4     if(!a&&!b&&!c)return 0;
 5     if(a&&b&&c){
 6         int lim=min(a,min(b,c));
 7         F(i,1,lim)if(!dfs(a-i,b-i,c-i))return f[a][b][c]=1;
 8     }
 9     if(a&&b&&!c){
10         int lim=min(a,b);
11         F(i,1,lim)if(!dfs(a-i,b-i,c))return f[a][b][c]=1;
12     }
13     if(a&&!b&&c){
14         int lim=min(a,c);
15         F(i,1,lim)if(!dfs(a-i,b,c-i))return f[a][b][c]=1;
16     }
17     if(!a&&b&&c){
18         int lim=min(b,c);
19         F(i,1,lim)if(!dfs(a,b-i,c-i))return f[a][b][c]=1;
20     }
21     if(a&&!b&&!c){
22         F(i,1,a)if(!dfs(a-i,b,c))return f[a][b][c]=1;
23     }
24     if(!a&&b&&!c){
25         F(i,1,b)if(!dfs(a,b-i,c))return f[a][b][c]=1;
26     }
27     if(!a&&!b&&c){
28         F(i,1,c)if(!dfs(a,b,c-i))return f[a][b][c]=1;
29     }
30     return f[a][b][c]=0;
31 }
十分智障

后面if进不去,脑抽。

shu ru fa zha le orz

猜你喜欢

转载自www.cnblogs.com/hzoi-yzh/p/11737325.html