CF1787E The Harmonization of XOR 题解
我甚至都忘记什么时候写的这玩意了。
由于异或满足交换律和结合律,所以首先需要保证 到 所有数字异或和等于 组的异或和。
其次我们考虑到 ,也就是说 组可以合并成 组,所以我们只需要最大化能够分的组数。
考虑最大化组数的一个方法:
- 如果 存在,单独分组
- 其余两两一组
- 剩下的在一组
证明:设 为 的最高位,即 的第 位为 (类似 popcount)
设 是从 到 的数字,并且使得第 位为 的数量,显然答案小于等于 ,因为在每个组中,必须至少有一个数字表示第 位为 。
这 个数字异或 之后肯定更小,所以一定存在 组。
时间复杂度 。
int n,k,x,p[maxn],vis[maxn]; int getsum(int x){ int i,s=0; for(i=1;i<=x;i++) s^=i; return s; } struct JTZ{ int x,y; }a[maxn]; int cnt,now; void work(){ n=read(); k=read(); x=read(); int i; if((k&1)?getsum(n)!=x:getsum(n)){ puts("NO"); return; } cnt=now=0; for(i=1;i<=n;i++) p[i]=vis[i]=0; for(i=1;i<=n;i++){ if(i==x) a[++cnt]=(JTZ){i,0},p[i]=1; if((i^x)<=n&&!p[i]&&!p[i^x]) p[i]=1,p[i^x]=1,a[++cnt]=(JTZ){i,i^x}; } if(cnt<k){ puts("NO"); return; } puts("YES"); for(i=1;i<k;i++){ if(a[i].y) pc('2'),pc(' '),print(a[i].x),pc(' '),print(a[i].y),pc('\n'),now+=2; else pc('1'),pc(' '),print(a[i].x),pc('\n'),now++; vis[a[i].x]=vis[a[i].y]=1; } print(n-now),pc(' '); for(i=1;i<=n;i++) if(!vis[i]) print(i),pc(' '); pc('\n'); return; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具