ZR#956 集合
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 集合的更多相关文章
- Mysql函数集合
Mysql提供了很多函数 提供的常用函数集合 一.数学函数 ABS(x) 返回x的绝对值 BIN(x) 返回x的二进制(OCT返回八进制,HEX返回十六进制) CEILING(x) 返回大于x的最小整 ...
- ZR#999
ZR#999 解法: 一道计数题,看到要求必须 $ m $ 个标号,所有标号至少出现一次的方案. 很容易想到可以容斥,但容斥这个东西是一种很神奇的东西,你可以看出来一道题需要容斥,但你就是不知道怎么容 ...
- Java集合--TreeMap
转载请注明出处:http://www.cnblogs.com/skywang12345/admin/EditPosts.aspx?postid=3310928 第1部分 TreeMap介绍 TreeM ...
- ZR并查集专题
ZR并查集专题 并查集,作为一个基础算法,对于初学者来说,下面的代码是维护连通性的利器 return fa[x] == x ? x : fa[x] = getf(fa[x]); 所以,但是这对并查集的 ...
- ZR提高失恋测2(9.7)
ZR提高失恋测2(9.7) 网址http://www.zhengruioi.com/contest/392 版权原因,不放题面 A 首先,我们发现对于匹配串\(s\)中所有满足\(s_i \not = ...
- 【database】oracle集合 - Associative Arrays、Varrays、Nested Tables
前言 参考oracle官方文档:PL/SQL Language Reference 11g Release 2 - 5 PL/SQL Collections and Records 可以去看下文档 ...
- java基础集合经典训练题
第一题:要求产生10个随机的字符串,每一个字符串互相不重复,每一个字符串中组成的字符(a-zA-Z0-9)也不相同,每个字符串长度为10; 分析:*1.看到这个题目,或许你脑海中会想到很多方法,比如判 ...
- .Net多线程编程—并发集合
并发集合 1 为什么使用并发集合? 原因主要有以下几点: System.Collections和System.Collections.Generic名称空间中所提供的经典列表.集合和数组都不是线程安全 ...
- 一起学 Java(三) 集合框架、数据结构、泛型
一.Java 集合框架 集合框架是一个用来代表和操纵集合的统一架构.所有的集合框架都包含如下内容: 接口:是代表集合的抽象数据类型.接口允许集合独立操纵其代表的细节.在面向对象的语言,接口通常形成一个 ...
随机推荐
- EF6.0中出现未找到具有固定名称“System.Data.SqlClient”的 ADO.NET提供程序的实体框架提供程序解决办法
在多工程项目中,由于EF封装在某一个工程里,那么该项目用于EF相关类库 EntityFramework.dll,以及EntityFramework.SqlServer.dll的引用 那么你一个启动工程 ...
- C#基础--Ref与Out区别
两者都是按地址传递的,使用后都将改变原来参数的数值. class Program { static void Main(string[] args) { int num = 1; Method(ref ...
- 验证 vector = 是深拷贝还是浅拷贝
#include <vector> using namespace std; int main() { int w=1920; int h = 1080; vector<int> ...
- 如何自定义starter
在springboot启动流程的系列文章中,我们看过了springboot的自动配置机制,本文将基于自动配置机制自定义一个自动配置的starter示例 正文 模块结构 首先,我们准备两个模块servi ...
- js入门第二篇之流程控制语句
表达式语句: 一个表达式可以产生一个值,有可能是运算.函数调用 字面量 表达式可以放在任何需要值的地方. 语句: 语句可以理解成一个行为,循环语句和判断语句就是典型的语句,一个程序有多个语句组成. 流 ...
- 第三方应用如何在SAP Kyma上进行服务注册
Jerry之前的公众号文章 什么?在SAP中国研究院里还需要会PHP开发?提到了一个SAP Kyma的应用场景: 旅行兼社交达人伊森,使用经过SAP Kyma扩展之后的WordPress这个网站来写博 ...
- MySQL之日期时间函数
1.NOW() 用法:显示当前日期和时间 举例: mysql> select NOW(); +---------------------+ | NOW() | +-------------- ...
- centos安装netcat工具及测试
netcat是网络工具中的瑞士军刀,它能通过TCP和UDP在网络中读写数据.通过与其他工具结合和重定向,你可以在脚本中以多种方式使用它.使用netcat命令所能完成的事情令人惊讶. netcat所做的 ...
- 03 WIndows编程——手绘函数调用过程
源码 #include<Windows.h> #include<stdio.h> int MessageBoxPrint(char *szFormat, ...); int W ...
- IT基础架构