题目描述

  给你一个长度为\(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的更多相关文章

  1. 区间第K小——可持久化线段树模板

    概念 可持久化线段树又叫主席树,之所以叫主席树是因为这东西是fotile主席创建出来的. 可持久化数据结构思想,就是保留整个操作的历史,即,对一个线段树进行操作之后,保留访问操作前的线段树的能力. 最 ...

  2. POJ- 2104 hdu 2665 (区间第k小 可持久化线段树)

    可持久化线段树 也叫函数式线段树也叫主席树,其主要思想是充分利用历史信息,共用空间 http://blog.sina.com.cn/s/blog_4a0c4e5d0101c8fr.html 这个博客总 ...

  3. 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 ...

  4. SPOJ-COT-Count on a tree(树上路径第K小,可持久化线段树)

    题意: 求树上A,B两点路径上第K小的数 分析: 同样是可持久化线段树,只是这一次我们用它来维护树上的信息. 我们之前已经知道,可持久化线段树实际上是维护的一个前缀和,而前缀和不一定要出现在一个线性表 ...

  5. 【XSY2720】区间第k小 整体二分 可持久化线段树

    题目描述 给你你个序列,每次求区间第\(k\)小的数. 本题中,如果一个数在询问区间中出现了超过\(w\)次,那么就把这个数视为\(n\). 强制在线. \(n\leq 100000,a_i<n ...

  6. 【COGS 1534】 [NEERC 2004]K小数 &&【COGS 930】 [河南省队2012] 找第k小的数 可持久化01Trie

    板子题,只是记得负数加fix最方便 #include <cstdio> ,N=; namespace FIFO { <<],*S=B,*T=B; #define getc() ...

  7. 树上第k小,可持久化线段树+倍增lca

    给定一颗树,树的每个结点都有权值, 有q个询问,每个询问是 u v k ,表示u到v路径上第k小的权值是多少. 每个结点所表示的线段树,是父亲结点的线段树添加该结点的权值之后形成的新的线段树 c[ro ...

  8. 【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 ...

  9. 可持久化Trie & 可持久化平衡树 专题练习

    [xsy1629]可持久化序列 - 可持久化平衡树 http://www.cnblogs.com/Sdchr/p/6258827.html [bzoj4260]REBXOR - Trie 事实上只是一 ...

随机推荐

  1. functools下的partial模块应用

    问题 你有一个被其他python代码使用的callable对象,可能是一个回调函数或者是一个处理器, 但是它的参数太多了,导致调用时出错. 解决方案 如果需要减少某个函数的参数个数,你可以使用 fun ...

  2. OO博客作业2:第5-7周作业总结

    (1)从多线程的协同和同步控制方面,分析和总结自己三次作业来的设计策略及其变化. 第5次作业:多线程电梯 基本照搬了课件上“生产者-消费者”模型的设计策略,将InputHandler设计为生产者线程, ...

  3. matplotlib 入门之The Lifecycle of a plot

    文章目录 Note 数据 准备开始 操控风格 我错了!!! 定制图像 特别注意!!! figsize=(width, height)!!! 格式化标签 组合多个可视化对象? 保存你的图片 matplo ...

  4. Python—randonm模块介绍

    random是python产生伪随机数的模块 >>> random.randrange(1,10) #返回1-10之间的一个随机数,不包括10 >>> random ...

  5. SQLSERVER事务日志已满 the transaction log for database 'xx' is full

    解决办法:清除日志 USE [master] GO ALTER DATABASE DNName SET RECOVERY SIMPLE WITH NO_WAIT GO ALTER DATABASE D ...

  6. scrapy之基础概念与用法

    scrapy之基础概念与用法 框架 所谓的框架就是一个项目的半成品.也可以说成是一个已经被集成了各种功能(高性能异步下载.队列.分布式.解析.持久化等)的具有很强通用性的项目模板. 安装 Linux: ...

  7. python3 九九乘法表打印花式操作(然并卵)

    # 九九乘法表# 方法一# for i in range(1, 10):# for j in range(1, i+1):# print('{}x{}={}\t'.format(i, j, i*j), ...

  8. nodejs配置nginx 以后链接mongodb数据库

    服务器 :windows server2008 R2 反向代理 :nginx 1.15.1 for window 64位 数据库:mongodb 4 64位 使用框架express 首先下载nodej ...

  9. tomcat server.xml各个端口的作用

    <Server port="8005" shutdown="SHUTDOWN"> <!-- port:指定一个端口,这个端口负责监听关闭Tom ...

  10. [转帖]IP地址、子网掩码、网络号、主机号、网络地址、主机地址以及ip段/数字-如192.168.0.1/24是什么意思?

    IP地址.子网掩码.网络号.主机号.网络地址.主机地址以及ip段/数字-如192.168.0.1/24是什么意思? 2016年03月26日 23:38:50 JeanCheng 阅读数:105674  ...