ZR#956 集合 待我称王封你为后i 2024-04-20 10:31 79阅读 0赞 ## ## ZR\#956 集合 ### 解法: ### > 维护一个异或操作的懒标记,并对应的处理插入、删除和异或操作。接下来考虑如何整体加一。 > 考虑一个数字 $ x $ 变为 $ (x+1) \\pmod \{2^\{30\}\} $ 的过程,设 $ x $ 在二进制表示下从低位到高位依次为 $ a\_1,a\_2,a\_3 \\cdots a\_\{30\} $ ,那么我们可以找一个最小的 $ i $ ,值得 $ a\_1=a\_2= \\cdots = a\{i-1\}=1 $ ,且 $ a\_i=0 $ ,然后将 $ a\_1,a\_2,a\_3 \\cdots a\_i $ 的值翻转。如果不存在这样的 $ i $ 那么我们认为 $ i = 31 $ ,此时要把全1变成全0。 > 然后我们考虑使用 $ trie树 $ 解决问题,翻转操作对应交换左右儿子操作。 > 时间复杂度 $ O((n+q)\\log\_2a\_i) $ ### CODE: ### #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> using namespace std; #define LL long long const int N = 2e5 + 5; const int INF = (1 << 30) - 1; int num[N >> 5],trie[N >> 5][2]; int q,ans[N >> 5],tot,cnt,s[N],n,tag; inline void build(int x,int z) { int u = 0; for(int i = 0 ; i < 30 ; i++) { int v = (x >> i) & 1; if(!trie[u][v]) trie[u][v] = ++cnt; u = trie[u][v]; } num[u] += z; } void work() { int u = 0,Cnt = 0; int res = ((1 << 30) - 1) ^ tag; for(int i = 0 ; i < 30 ; i++) { s[++Cnt] = u; int v = (res >> i) & 1; if(!trie[u][v]) break; u = trie[u][v]; } for(int i = 1 ; i <= Cnt ; i++) swap(trie[s[i]][0],trie[s[i]][1]); }//v是前缀路径上的所代表的值 void dfs(int u,int v,int depth) { if(depth == 30) { for(int i = 1 ; i <= num[u] ; i++) ans[++tot] = v ^ tag; return; } if(trie[u][0]) dfs(trie[u][0],v,depth+1); if(trie[u][1]) dfs(trie[u][1],v|(1<<depth),depth+1); return; } int main() { scanf("%d%d",&n,&q); for(int i = 1 ; i <= n ; i++) { int x; scanf("%d",&x); build(x,1); } while(q--) { int opt,x; scanf("%d",&opt); if(opt == 1) { scanf("%d",&x); build(x ^ tag,1); } else if(opt == 2) { scanf("%d",&x); build(x ^ tag,-1); } else if(opt == 3) work(); else if(opt == 4) { scanf("%d",&x); tag ^= x; } } dfs(0,0,0); sort(ans+1,ans+tot+1); for(int i = 1 ; i <= tot ; i++) printf("%d ",ans[i]); //system("pause"); return 0; } 转载于:https://www.cnblogs.com/Repulser/p/11455713.html
相关 ZR#997 ZR\997 解法: > 找找规律就出来了,全场最简单的一道题。 CODE: include<iostream> include<cstdi... 怼烎@/ 2024年04月20日 10:34/ 0 赞/ 89 阅读
相关 ZR#999 ZR\999 解法: > 一道计数题,看到要求必须 $ m $ 个标号,所有标号至少出现一次的方案。 > 很容易想到可以容斥,但容斥这个东西是一种很神奇... 清疚/ 2024年04月20日 10:34/ 0 赞/ 85 阅读
相关 ZR#957 ZR\957 解法: > 首先 $ T $ 必须得要是 $ S $ 的子序列,不然不存在好的下标序列,因此一定无解。 > 考虑判断一个串 $ T $ 是... 痛定思痛。/ 2024年04月20日 10:34/ 0 赞/ 87 阅读
相关 ZR#959 ZR\959 解法: > 对于一个询问,设路径 $ (u, v) $ 经过的所有边的 $ gcd $ 为 $ g $,这可以倍增求出。 > 考虑 $ g... Bertha 。/ 2024年04月20日 10:34/ 0 赞/ 90 阅读
相关 ZR#998 ZR\998 解法: > 先把所有物品按照拿走的时间从小到大排序,拿走的时间相同就按照放上去的时间从大到小。那么一件物品上方的物品就一定会在它的前面。 ... 柔光的暖阳◎/ 2024年04月20日 10:33/ 0 赞/ 100 阅读
相关 ZR#954 分组 ZR\954 分组 解法: > 设 $ f\[i\]\[a\]\[b\] $ 表示考虑了排序后的前 $ i $ 个人,目前已经有 $ a $ 个组配好了,还... 分手后的思念是犯贱/ 2024年04月20日 10:32/ 0 赞/ 87 阅读
相关 ZR#956 集合 ZR\956 集合 解法: > 维护一个异或操作的懒标记,并对应的处理插入、删除和异或操作。接下来考虑如何整体加一。 > 考虑一个数字 $ x $ 变为... 待我称王封你为后i/ 2024年04月20日 10:31/ 0 赞/ 80 阅读
相关 ZR#712 消灭砖块 题意: > 很多块砖分布在一个 $ m \\times m $ 的矩阵中,他可以消掉以他为左上角顶点的一个 $ n \\times n $ 的矩阵... 朱雀/ 2024年04月20日 10:24/ 0 赞/ 76 阅读
相关 ZR#710 雷劈数 题意: > 现在给出两个整数,求出位于两个整数之间的所有的“雷劈数。 解法: > 因为雷劈数特殊的性质,所以在数据范围中的雷劈数实际很少,直... ゝ一纸荒年。/ 2024年04月20日 10:24/ 0 赞/ 96 阅读
相关 ZR#996 ZR\996 解法: > 若删除长度为 $ x $ 的子串后序列中没有相同元素,那么一定有至少一个长度为 $ x+1 $ 的子串,删除它后序列中也没有相同元... 怼烎@/ 2024年04月20日 10:23/ 0 赞/ 84 阅读
还没有评论,来说两句吧...