Description

给定一个初始时为空的整数序列(元素由1开始标号)以及一些询问:
类型1:在数组后面就加入数字x。
类型2:在区间L…R中找到y,最大化(x xor y)。
类型3:删除数组最后K个元素。
类型4:在区间L…R中,统计小于等于x的元素个数。
类型5:在区间L…R中,找到第k小的数。
 
 

Input

输入数据第一行为一个整数q,表示询问个数,接下来q行,每行一条询问 对应题目描述。
类型1的询问格式为“1 x”。
类型2的询问格式为“2 L R x”。
类型3的询问格式为“3 k”。
类型4的询问格式为“4 L R x”。
类型5的询问格式为“5 L R k”。
 

Output

对于每个2、4、5询问输出一行对应答案
 

Sample Input

10
1 8
5 1 1 1
1 2
2 2 2 7
2 2 2 7
1 1
4 2 2 2
2 1 2 3
4 1 3 5
1 6

Sample Output

8
2
2
1
8
2

HINT

令N表示每次询问前数组中元素的个数
1<=L<=R<=N
1<=x<=500,000
对于第三类询问 1<=k<=N       
对于第五类询问 k<=R-L+1 
1<=N<=500,000
 
将操作树建出来,那么当前序列就是它到根的路径,然后用棵可持久化Trie就可以完成几个操作了。
这道题竟然不能用fread,我的正确率。!。~。
#include<cstdio>
#include<cctype>
#include<queue>
#include<cstring>
#include<algorithm>
#define rep(i,s,t) for(int i=s;i<=t;i++)
#define dwn(i,s,t) for(int i=s;i>=t;i--)
#define ren for(int i=first[x];i;i=next[i])
using namespace std;
const int BufferSize=1<<16;
char buffer[BufferSize],*head,*tail;
inline char Getchar() {
if(head==tail) {
int l=fread(buffer,1,BufferSize,stdin);
tail=(head=buffer)+l;
}
return *head++;
}
inline int read() {
int x=0,f=1;char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
for(;isdigit(c);c=getchar()) x=x*10+c-'0';
return x*f;
}
const int maxn=500010;
const int maxnode=10000010;
int ch[maxnode][2],s[maxnode],ToT;
void insert(int& ny,int x,int val) {
ny=++ToT;int y=ny;s[y]=s[x]+1;
dwn(i,18,0) {
int c=val>>i&1;
ch[y][0]=ch[x][0];ch[y][1]=ch[x][1];
s[ch[y][c]=++ToT]=s[ch[x][c]]+1;
y=ch[y][c];x=ch[x][c];
}
}
int querymx(int y,int x,int val) {
int ans=0;
dwn(i,18,0) {
int c=val>>i&1;
if(s[ch[y][c^1]]-s[ch[x][c^1]]) ans|=(1<<i),c^=1;
x=ch[x][c];y=ch[y][c];
}
return ans;
}
int query(int y,int x,int val) {
int ans=0;
dwn(i,18,0) {
int c=val>>i&1;
if(c) ans+=s[ch[y][0]]-s[ch[x][0]];
x=ch[x][c];y=ch[y][c];
}
return ans;
}
int kth(int y,int x,int k) {
int ans=0;
dwn(i,18,0) {
int k2=s[ch[y][0]]-s[ch[x][0]];
if(k<=k2) x=ch[x][0],y=ch[y][0];
else ans|=(1<<i),k-=k2,x=ch[x][1],y=ch[y][1];
}
return ans;
}
int n,top,fa[maxn],root[maxn],S[maxn];
int main() {
int p=0;
dwn(T,read(),1) {
int tp=read();
if(tp==1) insert(root[++n],root[p],read()),fa[n]=p,S[++top]=p=n;
else if(tp==3) dwn(i,read(),1) p=fa[p],top--;
else {
int l=read(),r=read(),x=read();
if(tp==2) printf("%d\n",x^querymx(root[S[r]],root[S[l-1]],x));
if(tp==4) printf("%d\n",query(root[S[r]],root[S[l-1]],x+1));
if(tp==5) printf("%d\n",kth(root[S[r]],root[S[l-1]],x));
}
}
return 0;
}

  

BZOJ4546: codechef XRQRS的更多相关文章

  1. bzoj 4546: codechef XRQRS [可持久化Trie]

    4546: codechef XRQRS 可持久化Trie codechef上过了,bzoj上蜜汁re,看别人说要开5.2e5才行. #include <iostream> #includ ...

  2. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  3. Involuting Bunny! (2021.9)

      文化课就很掉头发,文科都能学好我还怕竞赛?(   大概从"刷的题的题解"推广为"所有做的题的题解"吧,兔子比较懒,这样写题解轻松一些.   Gym10305 ...

  4. 【BZOJ-3514】Codechef MARCH14 GERALD07加强版 LinkCutTree + 主席树

    3514: Codechef MARCH14 GERALD07加强版 Time Limit: 60 Sec  Memory Limit: 256 MBSubmit: 1288  Solved: 490 ...

  5. 【BZOJ4260】 Codechef REBXOR 可持久化Trie

    看到异或就去想前缀和(⊙o⊙) 这个就是正反做一遍最大异或和更新答案 最大异或就是很经典的可持久化Trie,从高到低贪心 WA: val&(1<<(base-1))得到的并不直接是 ...

  6. codechef 两题

    前面做了这场比赛,感觉题目不错,放上来. A题目:对于数组A[],求A[U]&A[V]的最大值,因为数据弱,很多人直接排序再俩俩比较就过了. 其实这道题类似百度之星资格赛第三题XOR SUM, ...

  7. codechef January Challenge 2014 Sereja and Graph

    题目链接:http://www.codechef.com/JAN14/problems/SEAGRP [题意] 给n个点,m条边的无向图,判断是否有一种删边方案使得每个点的度恰好为1. [分析] 从结 ...

  8. BZOJ3509: [CodeChef] COUNTARI

    3509: [CodeChef] COUNTARI Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 339  Solved: 85[Submit][St ...

  9. CodeChef CBAL

    题面: https://www.codechef.com/problems/CBAL 题解: 可以发现,我们关心的仅仅是每个字符出现次数的奇偶性,而且字符集大小仅有 26, 所以我们状态压缩,记 a[ ...

随机推荐

  1. SQLAlchemy ORM高级查询之过滤,排序

    order_by,filter的语法. 用久了才会熟悉. Session = sessionmaker(bind=engine) session = Session() print(session.q ...

  2. 讲解JS的promise,这篇是专业认真的!

    http://www.zhangxinxu.com/wordpress/2014/02/es6-javascript-promise-%E6%84%9F%E6%80%A7%E8%AE%A4%E7%9F ...

  3. 攻城狮在路上(肆)How tomcat works(三) 连接器:Connector

     在介绍中提到,Catalina中有两个主要的模块:连接器和容器.本章中你将会写一个可以创建更好的请求和响应对象的连接器,用来改进第2章中的程序.一个符合Servlet 2.3和2.4规范的连接器必须 ...

  4. IBM Rational AppScan 无法记录登录序列 分类: 数据安全 2015-03-18 16:46 158人阅读 评论(0) 收藏

    为了测试漏洞,我在本地部署了一个站点,为http://localhost/app,并且有登录页面. 但是尝试多次,都无法记录登录页面.此时尝试了在hosts文件中,自定义了一个域名 127.0.0.1 ...

  5. php获取文件夹下面的文件列表和文件夹列表

    function getDir($dir) { $dirArray[] = NULL; if (false != ($handle = opendir( $dir ))) { $i=0; while ...

  6. 如何在Salesforce中进行代码开发

    两种方式: 1):用Salesforce自带的在线开发模式 Setup --> App Setup --> Develop --> than you can select 'Page ...

  7. loj 1412(树上最长直径的应用)

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1412 思路:好久没写题解了,有点手生,这题从昨天晚上wa到现在终于是过了...思想其实 ...

  8. 通信原理实践(二)——幅度调制

    一.幅度调制,并画出时域和频域波形 1.代码如下: function [ p_n ] = AM_func( N,fs,fm,Am,fc,Ac,Ma ) %UNTITLED 此处显示有关此函数的摘要 % ...

  9. AndroidStudio导入新项目一直卡在Building gradle project info的解决解决方案

      尝试了各种办法,FQ,离线gradle等,发现一个更好用更简单的办法: 解决方案: 1.随便找一个你能运行的as项目 2.打开gradle-wrapper.properties,文件目录:项目/g ...

  10. Android 开发工具之Codota

    Codota 的特性 的确,正如codota 官方所说,的确是精品,他的搜索源,不仅只有Github,而且还有知名博客和开发者网站,让你搜索一个东西,不用在找上半天: 除了搜索功能,首页的下方还罗列比 ...