本文共 1372 字,大约阅读时间需要 4 分钟。
确 实 非 常 巧 妙 确实非常巧妙 确实非常巧妙
注 意 到 a i 最 大 1000 , k 最 大 1000 , 所 以 a i ⊕ k 最 大 是 1023 注意到a_i最大1000,k最大1000,所以a_i\oplus k最大是1023 注意到ai最大1000,k最大1000,所以ai⊕k最大是1023
所 以 直 接 暴 力 模 拟 k 次 , 每 次 开 个 桶 记 录 j 这 个 数 字 出 现 了 几 次 所以直接暴力模拟k次,每次开个桶记录j这个数字出现了几次 所以直接暴力模拟k次,每次开个桶记录j这个数字出现了几次
那 么 第 i 次 操 作 的 桶 怎 么 转 移 到 i + 1 次 的 桶 呢 ? 那么第i次操作的桶怎么转移到i+1次的桶呢? 那么第i次操作的桶怎么转移到i+1次的桶呢?
假 设 当 前 j 这 个 数 字 在 第 i 次 操 作 后 出 现 了 w 次 假设当前j这个数字在第i次操作后出现了w次 假设当前j这个数字在第i次操作后出现了w次
那 么 根 据 只 对 奇 数 异 或 , 因 为 w 个 j 是 连 成 一 片 的 那么根据只对奇数异或,因为w个j是连成一片的 那么根据只对奇数异或,因为w个j是连成一片的
所 以 有 w / 2 个 j 去 异 或 , 有 w / 2 个 j 保 留 所以有w/2个j去异或,有w/2个j保留 所以有w/2个j去异或,有w/2个j保留
特 判 如 果 有 s 个 数 比 j 大 且 s 是 偶 数 w 是 奇 数 , 那 么 有 w / 2 + 1 个 j 去 异 或 特判如果有s个数比j大且s是偶数w是奇数,那么有w/2+1个j去异或 特判如果有s个数比j大且s是偶数w是奇数,那么有w/2+1个j去异或
#includeusing namespace std;const int maxn=2e5+20;int n,k,x,a[maxn],f[maxn],t[maxn];int main(){ cin >> n >> k >> x; for(int i=1;i<=n;i++) cin >> a[i],f[ a[i] ]++; for(int i=1;i<=k;i++) { int s=0;//比j小的数量 for(int j=0;j<=1024;j++) t[j]=f[j]; for(int j=0;j<1024;j++) { if(f[j]==0) continue; int shu=f[j]/2; if(s%2==0&&f[j]%2==1) shu++; //怎么理解?shu个j一定是连在一起的 //一般有shu/2个j在奇数位,但如果第一个j在奇数位且有奇数个j就要多加一个 t[j^x]+=shu,t[j]-=shu; s+=f[j]; } for(int j=0;j<1024;j++) f[j]=t[j]; } int minn=1e9,maxx=0; for(int i=0;i<1024;i++) if(f[i]) { maxx=max(maxx,i); minn=min(minn,i); } cout< <<" "<
转载地址:https://issue-is-vegetable.blog.csdn.net/article/details/107248687 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!