【XSY1098】第k小 可持久化trie
题目描述
给你一个长度为\(n\)数列\(a\),有\(m\)次操作:
\(1~x\):把所有数异或\(x\)
\(2~x\):把所有数与\(x\)
\(3~x\):把所有数或\(x\)
\(4~l~r~k\):求\(a_l\ldots a_r\)的第\(k\)小值。
\(n,m\leq 50000,0\leq x,a_i<2^{31}\)
题解
如果只有查询操作,可以用可持久化trie解决。
加上亦或操作,可以打标记解决。
与操作和或操作每次会将所有数的某些二进制变成一样,这些二进制位将来都是一样的。
所以直接暴力执行操作,然后打标记,表示这些二进制位已经相同了。如果与操作或或操作的\(x\)修改的二进制位都已经相同,就直接跳过。
时间复杂度:\(O(m\log x+n\log^2x)\)
代码
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<ctime>
#include<utility>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
int c[20000010][2];
int s[20000010];
int rt[50010];
int cnt;
int xo;
int insert(int x,int v,int d)
{
int y=++cnt;
s[y]=s[x]+1;
c[y][0]=c[x][0];
c[y][1]=c[x][1];
if(d==-1)
return y;
int b=(v>>d)&1;
c[y][b]=insert(c[y][b],v,d-1);
return y;
}
int query(int x,int y,int k,int d)
{
if(d==-1)
return 0;
int b=(xo>>d)&1;
if(s[c[y][b]]-s[c[x][b]]>=k)
return query(c[x][b],c[y][b],k,d-1);
return query(c[x][b^1],c[y][b^1],k-s[c[y][b]]+s[c[x][b]],d-1)|(1<<d);
}
int a[50010];
int n,m;
int all=0xffffffff,now=0;
void build()
{
int i;
cnt=0;
rt[0]=0;
for(i=1;i<=n;i++)
rt[i]=insert(rt[i-1],a[i],31);
}
int main()
{
freopen("xsy1098.in","r",stdin);
freopen("xsy1098.out","w",stdout);
int i,j;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
build();
char op[5];
int x,y,k;
for(i=1;i<=m;i++)
{
scanf("%s",op);
if(op[0]=='X')
{
scanf("%d",&x);
xo^=x;
xo&=all;
now^=x&(~all);
}
else if(op[0]=='O')
{
scanf("%d",&x);
if(x&all)
{
all&=~x;
for(j=1;j<=n;j++)
a[j]&=all;
build();
}
now|=x&(~all);
xo&=all;
}
else if(op[1]=='n')
{
scanf("%d",&x);
if((~x)&all)
{
all&=x;
for(j=1;j<=n;j++)
a[j]&=all;
build();
}
now&=x&(~all);
xo&=all;
}
else
{
scanf("%d%d%d",&x,&y,&k);
int ans=query(rt[x-1],rt[y],k,31);
ans|=now;
printf("%d\n",ans);
}
}
return 0;
}
【XSY1098】第k小 可持久化trie的更多相关文章
- 区间第K小——可持久化线段树模板
概念 可持久化线段树又叫主席树,之所以叫主席树是因为这东西是fotile主席创建出来的. 可持久化数据结构思想,就是保留整个操作的历史,即,对一个线段树进行操作之后,保留访问操作前的线段树的能力. 最 ...
- POJ- 2104 hdu 2665 (区间第k小 可持久化线段树)
可持久化线段树 也叫函数式线段树也叫主席树,其主要思想是充分利用历史信息,共用空间 http://blog.sina.com.cn/s/blog_4a0c4e5d0101c8fr.html 这个博客总 ...
- HDU 2665.Kth number-可持久化线段树(无修改区间第K小)模板 (POJ 2104.K-th Number 、洛谷 P3834 【模板】可持久化线段树 1(主席树)只是输入格式不一样,其他几乎都一样的)
Kth number Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- SPOJ-COT-Count on a tree(树上路径第K小,可持久化线段树)
题意: 求树上A,B两点路径上第K小的数 分析: 同样是可持久化线段树,只是这一次我们用它来维护树上的信息. 我们之前已经知道,可持久化线段树实际上是维护的一个前缀和,而前缀和不一定要出现在一个线性表 ...
- 【XSY2720】区间第k小 整体二分 可持久化线段树
题目描述 给你你个序列,每次求区间第\(k\)小的数. 本题中,如果一个数在询问区间中出现了超过\(w\)次,那么就把这个数视为\(n\). 强制在线. \(n\leq 100000,a_i<n ...
- 【COGS 1534】 [NEERC 2004]K小数 &&【COGS 930】 [河南省队2012] 找第k小的数 可持久化01Trie
板子题,只是记得负数加fix最方便 #include <cstdio> ,N=; namespace FIFO { <<],*S=B,*T=B; #define getc() ...
- 树上第k小,可持久化线段树+倍增lca
给定一颗树,树的每个结点都有权值, 有q个询问,每个询问是 u v k ,表示u到v路径上第k小的权值是多少. 每个结点所表示的线段树,是父亲结点的线段树添加该结点的权值之后形成的新的线段树 c[ro ...
- 【set】【可持久化Trie】The 16th UESTC Programming Contest Preliminary K - Will the circle be broken
题意:You are given an array A of N non-negative integers and an integer M. Find the number of pair(i,j ...
- 可持久化Trie & 可持久化平衡树 专题练习
[xsy1629]可持久化序列 - 可持久化平衡树 http://www.cnblogs.com/Sdchr/p/6258827.html [bzoj4260]REBXOR - Trie 事实上只是一 ...
随机推荐
- docker之导出、导入、数据搬迁
docker 导出 导入有二种,一种是备份镜像,一种备份容器.数据搬迁,最简单粗暴就是直接COPY,volume的路径就行了. 一.导出导入镜像 #导出为tar docker save #ID or ...
- elk之查询方式(4种)
es 在查询时, 可以指定搜索类型为下面四种: QUERY_THEN_FETCH QUERY_AND_FEATCH DFS_QUERY_THEN_FEATCH DFS_QUERY_AND_FEATCH ...
- Python_计算文件夹大小
计算文件夹大小 os.listdir('dirname') 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印 os.path.join(path1[, path2[, ...]]) 将 ...
- YARN的笔记
- python3 Tkinter GUI 试水
from tkinter import * #导入tkinter下所有包,用于GUI开发#窗口创建tk=Tk()cans=Canvas(tk,width=400,height=400)#定义窗口规格c ...
- 批量处理word所有回车行
在WORD中点击CTRL+H,弹出对话框,输入如下替换符
- js对字符串的一些操作方法
1.charCodeAt(index); 返回一个整数,代表下标位置上字符的Unicode的编码. 2.fromCharCode(code1,code2,code3,...); code1代表Unic ...
- python语法糖/装饰器
1.python高阶函数和嵌套函数 1.1高阶函数 def func1(x): return x**2 def func2(x): return x**3 def func(x,y): return ...
- echo "" > 和 echo "" >> 的区别
在写shell脚本中,如果判断一个文件已经存在,但希望重写这个文件,一般用如下方式 echo "" > file.txt 这个表示清空文件的内容,如果使用 echo “” & ...
- Front-end Job Interview Questions
Front-end Job Interview Questions 前端面试 https://github.com/h5bp/Front-end-Developer-Interview-Questio ...