C. Jon Snow and his Favourite Number(构造)
发布日期:2021-06-30 10:18:08 浏览次数:2 分类:技术文章

本文共 1372 字,大约阅读时间需要 4 分钟。

确 实 非 常 巧 妙 确实非常巧妙

注 意 到 a i 最 大 1000 , k 最 大 1000 , 所 以 a i ⊕ k 最 大 是 1023 注意到a_i最大1000,k最大1000,所以a_i\oplus k最大是1023 ai1000,k1000,aik1023

所 以 直 接 暴 力 模 拟 k 次 , 每 次 开 个 桶 记 录 j 这 个 数 字 出 现 了 几 次 所以直接暴力模拟k次,每次开个桶记录j这个数字出现了几次 k,j

那 么 第 i 次 操 作 的 桶 怎 么 转 移 到 i + 1 次 的 桶 呢 ? 那么第i次操作的桶怎么转移到i+1次的桶呢? ii+1?

假 设 当 前 j 这 个 数 字 在 第 i 次 操 作 后 出 现 了 w 次 假设当前j这个数字在第i次操作后出现了w次 jiw

那 么 根 据 只 对 奇 数 异 或 , 因 为 w 个 j 是 连 成 一 片 的 那么根据只对奇数异或,因为w个j是连成一片的 ,wj

所 以 有 w / 2 个 j 去 异 或 , 有 w / 2 个 j 保 留 所以有w/2个j去异或,有w/2个j保留 w/2j,w/2j

特 判 如 果 有 s 个 数 比 j 大 且 s 是 偶 数 w 是 奇 数 , 那 么 有 w / 2 + 1 个 j 去 异 或 特判如果有s个数比j大且s是偶数w是奇数,那么有w/2+1个j去异或 sjsw,w/2+1j

#include 
using 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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:D. Cloud of Hashtags(逆向贪心)
下一篇:C. The Tag Game(树的深度)

发表评论

最新留言

哈哈,博客排版真的漂亮呢~
[***.90.31.176]2024年04月09日 13时00分10秒