题解:AT_agc057_c [AGC057C] Increment or Xor

news/2025/10/3 20:13:04/文章来源:https://www.cnblogs.com/LUlululu1616/p/19124943

题意:很简单了,不再赘述。

做法:

先观察一下打打表,发现首先必须满足 \(a_i\equiv a_{i+\frac{N}2}\pmod {\frac{N}2}\),这里 \(N=2^n\),因为结束状态满足,且这两种操作都不影响他们对 \(\frac{N}{2}\) 取模的关系。

然后考虑我肯定是要让前 \(\frac{N}{2}\) 位的最高位要一样,变成 \(0\) 比较方便,我们就扫一遍,如果找到一个最高位为 \(1\) 的,那么就让他补全所有位再加一,这样就可以做到一个最高位取反的效果。

那么你可能会问这里为什么会保证不会影响其他的最高位呢,因为如果会影响,那么一定是满足他们两个模 \(\frac{N}2\) 同余,这样加一才能一起进位,但是显然是不存在的,所以不会影响到。

然后再用一次异或操作,将 \(a_0\) 变成 \(0\),其他的如果不是 \(a_i=i\) 那么就不可行。

但是这里其实还是可能可以用加一操作的,为什么我们不用考虑呢?

我们先讲如何实现,最后来解决这个问题。

跟位运算有关,大多可以拍到 Trie 树上来做,但是如果从高位往低位排不是很好做 \(+1\),我们考虑从低位往高位建立,这样 \(+1\) 就等于一条左链去 swap 左右儿子,然后就解决了,查询一个点就直接按点的编号向上跳即可,异或 \(x\) 就对 \(x\) 在二进制位上的 \(1\) 的位进行打标记即可。

那么来解释上面为什么不用 \(+1\) 的问题,我们发现最后我们要求的第 \(n-1\) 位一定是左儿子为前 \(\frac{N}{2}\) 位,但是如果 \(+1\) 就会打乱这个顺序,并且稍微手玩并理解一下,如果 \(+x\),第 \(p\) 位为 \(1\),那么就是从最右侧往左数第 \(p\) 组的儿子翻转了一下,可以看看图:

并且异或只是对整体一起交换,不会对底层内部交换,所以还是得靠加一才能交换内部,\(\frac{N}{2}\) 一个周期,但是显然是无意义的,所以只用考虑一次异或后是否合法就可以了。

代码:

#include <bits/stdc++.h>
using namespace std;
const int maxn = (1 << 18) + 5;
struct node {int son[2], tag, fa;
} ;
vector<int> ans;
int n, N, a[maxn], p[maxn];
struct Trie {node tr[maxn << 2];int tot = 1, tag[maxn];int insert(int x) {int p = 1;for (int i = 0; i < n; i++) {int t = (x >> i) & 1;if(!tr[p].son[t])tr[p].son[t] = ++tot, tr[tot].fa = p;p = tr[p].son[t];}return p;}void make_xor(int x) {ans.push_back(x);for (int i = 0; i < n; i++)tag[i] ^= (x >> i) & 1;}void make_add() {int p = 1;for (int i = 0; i < n; i++) {swap(tr[p].son[0], tr[p].son[1]);if(tag[i])p = tr[p].son[1];elsep = tr[p].son[0];}ans.push_back(-1);}int query(int u) {int res = 0;for (int i = n - 1; i >= 0; i--) res += (tr[tr[u].fa].son[tag[i] ^ 1] == u) * (1 << i), u = tr[u].fa;return res;} 
} tree;
int main() {cin >> n, N = (1 << n);for (int i = 0; i < N; i++)cin >> a[i];for (int i = 0; i < N / 2; i++)if(a[i] % (N / 2) != a[i + N / 2] % (N / 2)) {cout << "No" << endl;return 0;}for (int i = 0; i < N; i++)p[i] = tree.insert(a[i]);for (int i = 0; i < N / 2; i++) {int x = tree.query(p[i]);//	cout << x << endl;if(x & (N / 2)) tree.make_xor(N - 1 - x), tree.make_add();}tree.make_xor(tree.query(p[0]));for (int i = 0; i < N; i++)	if(tree.query(p[i]) != i) {cout << "No" << endl;return 0;}cout << "Yes" << endl;cout << ans.size() << endl;for (int i = 0; i < ans.size(); i++)cout << ans[i] << " ";cout << endl;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/926276.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

怎样切图做网站六盘水网站设计

ENSP默认路由配置 1&#xff0c;配置R1路由器 sys ##进入系统视图模式 [Huawei]sys R1 ##修改名字 [R1]int e0/0/0 ##进入接口 [R1-Ethernet0/0/0]ip add 192.168.1.254 24 ##配置ip地址 [R1-Ethernet0/0/0]undo shut ##开启物理接口 [R1-Ethernet0/0/1]int e0/0/1 [R1-Etherne…

网站建设方面的论文东莞市南城装饰工程东莞网站建设

hello&#xff0c;大家好&#xff0c;本讲我们一起聊一下常见的几个并发工具类的使用和坑&#xff01; 在日常工作中&#xff0c;我们经常会遇到多线程并发问题&#xff0c;比如ThreadLocal、锁、ConcurrentHashMap、CopyOnWriteArrayList等。那么如何正常的使用呢&#xff1f;…

Spring框架常见的注解 - 实践

Spring框架常见的注解 - 实践2025-10-03 20:03 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important…

C# MVVM模式和Qt中MVC模式的比较 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

图书馆网站建设公司秒拍wordpress插件

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…

网站建设关键字优化网页制作基础教程visual studio code

Python面向对象编程 1.面向对象概念介绍1) 面相过程 —— 怎么做&#xff1f;2&#xff09;面向对象 谁来做 2.类和对象2.1类2.2对象2.3类和对象的关系2.4类的设计2.5面向对象设计案例 士兵类设计2.6身份运算符 3.私有属性和私有方法3.1. 应用场景及定义方式 4.继承、多态重写父…

使用 Copilot AI + Blazor 编一个五子棋游戏

1. 创建 Blazor web工程,选Auto2. 打开 GitHub Copilot 窗口,输入提示词 使用 Blazor 编一个五子棋游戏3.复制代码测试 为了方便调试, 我们先把运行模式由 InteractiveAuto 改为 InteractiveServer 打开 App.razor 编辑…

关于VMware虚拟机如何下载-2025.10.3

关于VMware虚拟机如何下载-2025.10.3现在要想下载VMware有以下办法: 一:直接到这个链接:https://www.vmware.com/products/desktop-hypervisor/workstation-and-fusion 点击 DOWNLOAD FUSION OR WORKSTATION后在这个…

RAG核心特性:ETL - 指南

RAG核心特性:ETL - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", &q…

国庆集训做题10.1 - 10.3

国庆集训做题 CSP-S模拟25 t1 : 爱丽丝的数位划分 题意简述 : 将序列A划分为k个不相交连续非空子序列,求最大的总优美度。 优美度指子序列中十进制表示数字不同的个数,一个方案的优美度是所有子序列优美度的和 首先…

免费申请网站空间网站转化率分析工具

Java线程6种状态和工作原理详解&#xff0c;Java创建线程的4种方式 目录 一、Java线程的六种状态 二、Java线程是如何工作的&#xff1f; 三、BLOCKED 和 WAITING 的区别 四、start() 和 run() 源码分析 五、Java创建线程的所有方式和代码详解 1. 继承Thread类 2. 实现…

政务公开网站建设情况从哪里下载wordpress

以前安装这个软件的时候&#xff0c; 是在windows和mac上&#xff0c;都是图形化的安装方式&#xff0c;但是ubuntu不太一样&#xff0c;需要增加源&#xff0c;然后执行命令。安装的系统版本是2004。 参考链接1&#xff0c;主要命令包含下面几个部分&#xff1a; 第一步&…

XCSY暑期集训模拟赛2T3善良

XCSY暑期集训模拟赛2T3善良暴力(50pts) 对于每个询问,遍历\([l,r]\),统计其中k的数量,时间复杂度为\(O(nm)\)。 for(int i=1;i<=n;i++) cin>>a[i]; while(m--){cin>>l>>r>>k;int ans=0;…

玳瑁的嵌入式日记---0928(ARM--UART) - 指南

玳瑁的嵌入式日记---0928(ARM--UART) - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &q…

网站开发需要那些技能电子商务平台中搜索词拆解时

产生原因:因为项目最近设计到了一个Quartz相关的模块&#xff0c;前端需要传递时间参数到后台, 然后后台设置一个新的定时任务, 所以后台需要一个可以实现Date与cron之间的相互转换(因为Quartz需要的Cron格式的数据)&#xff0c;所以就借助java的SimpleDateFormat的格式化,然后…

解决Visual Studio中无法使用scanf和C++万能头的问题

解决Visual Studio中无法使用scanf和C++万能头的问题Visual Studio中无法使用scanf和C++万能头? 来吧,跟我一起操作! 1.在桌面上创建万能头文件, 并命名为stdc++.h: 记得把文件后缀名给打开哟! 2.用记事本打开std…

太仓专业网站建设我想创个网站

目录 项目背景 项目技术栈 项目介绍 项目亮点 项目启动 1.创建SSM&#xff08;省略&#xff09; 2.配置项目信息 3.将前端页面加入到项目中 4.初始化数据库 5.创建标准分层的目录 6.创建和编写项目中的公共代码以及常用配置 7.创建和编写业务的Entity、Mapper、…

网页站点不安全静海网站开发

虚拟机是软件 对于第一次听说虚拟机&#xff08;Virtual Machine&#xff0c;VM&#xff09;的人来说&#xff0c;可能以为还要再花钱买一台计算机&#xff0c;这恐怕是他们最担心的。所谓虚拟机&#xff0c;就是在你的计算机上再虚拟出另一台计算机来。这台虚拟出来的计算机&…

技术培训学校机构做360手机网站优化

1.1. Socket简介 套接字&#xff08;socket&#xff09;是一种通信机制&#xff0c;凭借这种机制&#xff0c; 客户端<->服务器 模型的通信方式既可以在本地设备上进行&#xff0c;也可以跨网络进行。 Socket英文原意是“孔”或者“插座”的意思&#xff0c;在网络编程…