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;
}

ZR#956 集合的更多相关文章

  1. Mysql函数集合

    Mysql提供了很多函数 提供的常用函数集合 一.数学函数 ABS(x) 返回x的绝对值 BIN(x) 返回x的二进制(OCT返回八进制,HEX返回十六进制) CEILING(x) 返回大于x的最小整 ...

  2. ZR#999

    ZR#999 解法: 一道计数题,看到要求必须 $ m $ 个标号,所有标号至少出现一次的方案. 很容易想到可以容斥,但容斥这个东西是一种很神奇的东西,你可以看出来一道题需要容斥,但你就是不知道怎么容 ...

  3. Java集合--TreeMap

    转载请注明出处:http://www.cnblogs.com/skywang12345/admin/EditPosts.aspx?postid=3310928 第1部分 TreeMap介绍 TreeM ...

  4. ZR并查集专题

    ZR并查集专题 并查集,作为一个基础算法,对于初学者来说,下面的代码是维护连通性的利器 return fa[x] == x ? x : fa[x] = getf(fa[x]); 所以,但是这对并查集的 ...

  5. ZR提高失恋测2(9.7)

    ZR提高失恋测2(9.7) 网址http://www.zhengruioi.com/contest/392 版权原因,不放题面 A 首先,我们发现对于匹配串\(s\)中所有满足\(s_i \not = ...

  6. 【database】oracle集合 - Associative Arrays、Varrays、Nested Tables

    前言 参考oracle官方文档:PL/SQL Language Reference 11g Release 2  -  5 PL/SQL Collections and Records 可以去看下文档 ...

  7. java基础集合经典训练题

    第一题:要求产生10个随机的字符串,每一个字符串互相不重复,每一个字符串中组成的字符(a-zA-Z0-9)也不相同,每个字符串长度为10; 分析:*1.看到这个题目,或许你脑海中会想到很多方法,比如判 ...

  8. .Net多线程编程—并发集合

    并发集合 1 为什么使用并发集合? 原因主要有以下几点: System.Collections和System.Collections.Generic名称空间中所提供的经典列表.集合和数组都不是线程安全 ...

  9. 一起学 Java(三) 集合框架、数据结构、泛型

    一.Java 集合框架 集合框架是一个用来代表和操纵集合的统一架构.所有的集合框架都包含如下内容: 接口:是代表集合的抽象数据类型.接口允许集合独立操纵其代表的细节.在面向对象的语言,接口通常形成一个 ...

随机推荐

  1. angular 源码 <一> rotuerLinkActive

    这几篇,查看angular 源码. rotuerLinkActive 是路由的样式设置. 它的值是 css 的一个类.或者几个类. 主要代码如下 @Input() set routerLinkActi ...

  2. 使用ctypes调用系统C API函数需要注意的问题,函数参数中有指针或结构体的情况下最好不要修改argtypes

    有人向我反应,在代码里同时用我的python模块uiautomation和其它另一个模块后,脚本运行时会报错,但单独使用任意一个模块时都是正常的,没有错误.issue链接 我用一个例子来演示下这个问题 ...

  3. burpsuite暴力破解dvwa的登录密码

    前提准备条件: 1.下载安装dvwa,下载链接地址:http://www.dvwa.co.uk/. 2.安装php+mysql环境,我用的是这个软件(phpStudy)下载地址:https://www ...

  4. man手册--iostat

    iostat手册 IOSTAT(1) Linux User's Manual IOSTAT(1) NAME iostat - Report Central Processing Unit (CPU) ...

  5. pandas行转列、列转行、以及一行生成多行

    楔子 笔者曾经碰到过两种格式的数据,当时确实把我难住了,最后虽然解决了,但是方法不够优雅,而且效率也不高,如果想高效率,那么就必须使用pandas提供的方法.而pandas作为很强的一个库,一定可以优 ...

  6. python获取字符串的前几个字符(包含汉字)

    一个简单的字符串,比如a="小明xiaoming"或者b="小xiao明ming".想在只想得到字符串的前4个元素,a1="小明xi",b= ...

  7. win10激活密钥

    专业版:W269N-WFGWX-YVC9B-4J6C9-T83GX 企业版:NPPR9-FWDCX-D2C8J-H872K-2YT43 家庭版:TX9XD-98N7V-6WMQ6-BX7FG-H8Q9 ...

  8. springboot @value 注解的使用

    1,通过@value来注入对应的值,直接在字段上添加@value 获取application.properties文件中的值. @Configuration public class DemoConf ...

  9. 求输入数字的阶乘 及加和 #s=1!+2!+3!+…..+n!

    #s=1!+2!+3!+…..+n! from functools import reduce def factorial(n): result=0 for i in range(1,n+1): re ...

  10. linux tcp server bind

    如果不是系统管理员: bind()函数 返回失败