【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 事实上只是一 ...
随机推荐
- 解析vue2.0的diff算法 虚拟DOM介绍
react虚拟dom:依据diff算法台 前端:更新状态.更新视图:所以前端页面的性能问题主要是由Dom操作引起的,解放Dom操作复杂性 刻不容缓 因为:Dom渲染慢,而JS解析编译相对非常非常非常快 ...
- Mike and distribution CodeForces - 798D (贪心+思维)
题目链接 TAG: 这是我近期做过最棒的一道贪心思维题,不容易想到,想到就出乎意料. 题意:给定两个含有N个正整数的数组a和b,让你输出一个数字k ,要求k不大于n/2+1,并且输出k个整数,范围为1 ...
- JAVA项目中的常用的异常处理情况
NO.1 java.lang.NullPointerException 这个异常比较容易遇到,此异常的解释是“程序遇上了空指针”,简单地说就是调用了未经初始化的对象或者是不存在的对象,这个错误经常出现 ...
- CentOS7源码升级OpenSSL和OpenSSH
一.CentOS7升级OpenSSL 1.查看ssl版本及下载相关依赖包 openssl version -a yum install -y gcc openssl-devel pam-devel r ...
- Python_计算文件夹大小
计算文件夹大小 os.listdir('dirname') 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印 os.path.join(path1[, path2[, ...]]) 将 ...
- Ubuntu Linux Recovery Mode
在安全模式/修復模式有以下的選項︰resume Resume normal boot繼續正常啟動作業,供不小心誤入此選單的使用者開機使用.(继续以正常模式启动) clean Try to make f ...
- SpringMVC controller 时间 T
Spring MVC 之 处理Date类型 - carl.zhao的专栏 - CSDN博客https://blog.csdn.net/u012410733/article/details/727730 ...
- Oracle Flashback 详解
Oracle flashback 是一种方便快捷的数据库恢复技术,它不使用备份文件,通过闪回日志可以使数据库恢复到过去的某个状态,当用户发生逻辑错误时(误删表数据.表.表空间等)需要快速恢复数据库,可 ...
- 一条SQL语句执行得很慢的原因有哪些?(转)
一条 SQL 语句执行的很慢,那是每次执行都很慢呢?还是大多数情况下是正常的,偶尔出现很慢呢?所以我觉得,我们还得分以下两种情况来讨论. 1.大多数情况是正常的,只是偶尔会出现很慢的情况. 2.在数据 ...
- TextView不用ScrollViewe也可以滚动的方法
转自:http://www.jb51.net/article/43377.htm android TextView不用ScrollViewe也可以滚动的方法. TextView textview = ...