有N个位置,M个操作。操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c
如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数是多少。
为了强制在线,每一次的a,b是加密的,需要异或lastans的后8位进行解密,其中lastans为上次输出的结果,初始为零。
如果解密后a>b则先交换a,b
数据保证解密后a,b不会超过N
如果解密后a,b出现0,则赋值为1。

来历:bzoj上的一道题,经过子祯学长的魔改后,数据范围变得很奇怪...

算法:树套树;

权值线段树套线段树;

套线段树有技巧:一颗线段树可以先只创造一个点,其他需要的节点需要用到的时候再开就可以了;

其他的也没什么可说了,看代码吧:

(不要交到bzoj上,过不了,这是经过魔改的题目)

(不建议借鉴,初次写这种题,code还比较稚嫩)

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<ctime>
#include<cmath>
#include<set>
#include<map>
#include<queue>
#include<algorithm>
#include<iomanip>
#include<stack>
using namespace std;
#define FILE "dealing"
#define up(i,j,n) for(int i=(j);i<=(n);i++)
#define pii pair<int,int>
#define LL long long
#define mem(f,g) memset(f,g,sizeof(f))
namespace IO{
char buf[1<<15],*fs,*ft;
int gc(){return (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<15,stdin),fs==ft))?-1:*fs++;}
int read(){
int ch=gc(),f=0,x=0;
while(ch<'0'||ch>'9'){if(ch=='-')f=1;ch=gc();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=gc();}
return f?-x:x;
}
int readint(){
int ch=getchar(),f=0,x=0;
while(ch<'0'||ch>'9'){if(ch=='-')f=1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
return f?-x:x;
}
}using namespace IO;
const int maxn=201000,inf=1000000000;
int n,m;
int ch[maxn],l[maxn],r[maxn],k[maxn],f[maxn];
struct node{
int k,id;
bool operator<(const node& b)const{return k<b.k;}
}Cnt[maxn];
int L=0;
namespace OI{
#define mid ((l+r)>>1)
const int maxm=20000000;
int root=0,c[maxn][2],id[maxn],cnt=0;//权值线段树
LL sum[maxm],flag[maxm];
int d[maxm][2],len=0;//区间线段树
int x,y,key;
void pushdown(int o,int l,int r){
if(flag[o]){
if(l!=r&&!d[o][0])d[o][0]=++len;
if(l!=r&&!d[o][1])d[o][1]=++len;
sum[d[o][0]]+=flag[o]*(mid-l+1);
sum[d[o][1]]+=flag[o]*(r-mid);
flag[d[o][0]]+=flag[o];
flag[d[o][1]]+=flag[o];
flag[o]=0;
}
}
void change(int l,int r,int& o){
if(l>y||r<x)return;
if(!o)o=++len;
if(l>=x&&r<=y){
sum[o]+=r-l+1;
flag[o]++;
return;
}
pushdown(o,l,r);
change(l,mid,d[o][0]);
change(mid+1,r,d[o][1]);
sum[o]=sum[d[o][1]]+sum[d[o][0]];
}
void insert(int l,int r,int& o){
if(l>key||r<key)return;
if(!o)o=++cnt;
change(1,n,id[o]);
if(l==key&&r==key)return;
insert(l,mid,c[o][0]);
insert(mid+1,r,c[o][1]);
}
void init(int l,int r,int k){
x=l,y=r,key=k;
insert(1,L,root);
}
int query2(int l,int r,int o){
if(l>y||r<x||!o)return 0;
if(l>=x&&r<=y)return sum[o];
pushdown(o,l,r);
return query2(l,mid,d[o][0])+query2(mid+1,r,d[o][1]);
}
int query1(int l,int r,int o){
if(!o||r<=key)return 0;
if(l>key)return query2(1,n,id[o]);
return query1(l,mid,c[o][0])+query1(mid+1,r,c[o][1]);
}
int Query(int l,int r,int val){
x=l,y=r,key=val;
return query1(1,L,root)+1;
}
int Q(int l,int r,int k){
int left=1,right=L,midd,p;
while(left+1<right){
midd=(left+right)>>1;
if(Query(l,r,midd)>k)left=midd;
else right=midd;
}
if(Query(l,r,left)>k&&Query(l,r,right)<=k)return right;
else return left;
}
}using namespace OI;
void print(int *a,int n){up(i,1,n)printf("%d ",a[i]);cout<<endl;}
int main(){
freopen(FILE".in","r",stdin);
freopen(FILE".out","w",stdout);
n=read(),m=read();
up(i,1,m){
ch[i]=read(),l[i]=read(),r[i]=read(),k[i]=read();
if(ch[i]==1)Cnt[++L].k=k[i],Cnt[L].id=i;
}
sort(Cnt+1,Cnt+L+1);
up(i,1,L)f[Cnt[i].id]=i;
int pre=0,d=(1LL<<8)-1;
up(i,1,m){
l[i]^=(pre&d),r[i]^=(pre&d);
if(!l[i])l[i]=1;if(!r[i])r[i]=1;
if(l[i]>r[i])swap(l[i],r[i]);
if(ch[i]==1)init(l[i],r[i],f[i]);
if(ch[i]==2)printf("%d\n",pre=Cnt[Q(l[i],r[i],k[i])].k);
}
return 0;
}

  

[树套树]K大数查询的更多相关文章

  1. BZOJ 3110: [Zjoi2013]K大数查询 [树套树]

    3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 6050  Solved: 2007[Submit][Sta ...

  2. 树套树专题——bzoj 3110: [Zjoi2013] K大数查询 &amp; 3236 [Ahoi2013] 作业 题解

    [原题1] 3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 978  Solved: 476 Descri ...

  3. bzoj 3110: [Zjoi2013]K大数查询 树状数组套线段树

    3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1384  Solved: 629[Submit][Stat ...

  4. P3332 [ZJOI2013]K大数查询(线段树套线段树+标记永久化)

    P3332 [ZJOI2013]K大数查询 权值线段树套区间线段树 把插入的值离散化一下开个线段树 蓝后每个节点开个线段树,维护一下每个数出现的区间和次数 为了防止MLE动态开点就好辣 重点是标记永久 ...

  5. 【bzoj3110】[Zjoi2013]K大数查询 权值线段树套区间线段树

    题目描述 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c.如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数 ...

  6. Cogs 1345. [ZJOI2013] K大数查询(树套树)

    [ZJOI2013] K大数查询 /* 树套树写法. bzoj过不了. 可能有负数要离散吧. 线段树套线段树. 外层权值线段树,内层区间线段树维护标记. 对权值建一棵权值线段树. 某个点表示权值在某个 ...

  7. ZJOI2013 K大数查询 和 LG3380【模板】二逼平衡树(树套树)

    K大数查询 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c:如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的 ...

  8. [BZOJ 3110] [luogu 3332] [ZJOI 2013]k大数查询(权值线段树套线段树)

    [BZOJ 3110] [luogu 3332] [ZJOI 2013]k大数查询(权值线段树套线段树) 题面 原题面有点歧义,不过从样例可以看出来真正的意思 有n个位置,每个位置可以看做一个集合. ...

  9. BZOJ 3110 k大数查询 & 树套树

    题意: 有n个位置,每个位置可以看做一个集合,现在要求你实现一个数据结构支持以下功能: 1:在a-b的集合中插入一个数 2:询问a-b集合中所有元素的第k大. SOL: 调得火大! 李建说数据结构题能 ...

  10. 数据结构(树套树):ZJOI 2013 K大数查询

    有几个点卡常数…… 发现若第一维为位置,第二维为大小,那么修改时第一维修改区间,查询时第一维查询区间,必须挂标记.而这种情况下标记很抽象,而且Push_down不是O(1)的,并不可行. 那要怎么做呢 ...

随机推荐

  1. [NOI2001] 食物链 (扩展域并查集)

    题目描述 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形.A 吃 B,B 吃 C,C 吃 A. 现有 N 个动物,以 1 - N 编号.每个动物都是 A,B,C 中的一种,但是我 ...

  2. iOS开发中16进制颜色(html颜色值)字符串转为UIColor

    //16进制颜色(html颜色值)字符串转为UIColor +(UIColor *) hexStringToColor: (NSString *) stringToConvert { NSString ...

  3. Educational Codeforces Round 36 (Rated for Div. 2) G. Coprime Arrays

    求a_i 在 [1,k]范围内,gcd(a_1,a_2...,a_n) = 1的a的数组个数. F(x)表示gcd(a_1,a_2,...,a_n) = i的a的个数 f(x)表示gcd(a_1,a_ ...

  4. sugar与阿龙的互怼(第一季)

    §   第一季 回家风波 高考了,啦啦啦~ 快要高考了,显然sugar很伤心. 显然不是因为快要考试了sugar才伤心的. 那为什么??? 因为他们都回家了,但是sugar和他的小伙伴们都不回家!!! ...

  5. Angular 路由⑦要素

    cnzt       http://www.cnblogs.com/zt-blog/p/7919185.html http://www.cnblogs.com/zt-blog/p/7919185.ht ...

  6. Android开发—智能家居系列】(二):用手机对WIFI模块进行配置

    在实际开发中,我开发的这款APP是用来连接温控器,并对温控器进行控制的.有图为证,哈哈. 上一篇文章[Android开发—智能家居系列](一):智能家居原理的文末总结中写到: 手机APP控制智能温控器 ...

  7. Mysql 之配置文件my.cnf

    mysql配置文件为my.cnf,它所在位置根据安装时设定的. 当mysqld服务启动的时候,默认会按一定的顺序读取配置文件的. 1 2 3 [root@zhu2 ~]# /opt/mysql/lib ...

  8. 64-bit Itanium与x64

    64-bit Itanium是什么意思 64-bit Itanium,指的是intel 安腾处理器,intel安腾处理器是Intel的某一代处理器,当然是在酷睿(即core)这一代之前出来的. ora ...

  9. 项目整理--Echarts前端后台的贯通写法

    项目整理–Echarts前端后台的贯通写法 注:下面所有内容建立在FH admin开源框架和eharts插件基础上,建议观看本案例者进行了解. 业务逻辑 绘制两张图表.分别显示城市空间库和其它数据仓库 ...

  10. JAVA_MyEclipse如何加载Tomcat

          注意Tomcat不要放到Program Files这种有空格的路径下面!,下图所示是错误的