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的前缀桶再相减。
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
原文地址:https://www.cnblogs.com/hzoi-yzh/p/11737325.html
时间: 2024-10-20 06:59:09