题意:动态第k大,可单点更新,操作+原数组范围6e4

年轻人的第一道纯手工树套树

静态第k大可以很轻易的用权值主席树作差而得

而动态第k大由于修改第i个数会影响[i...n]棵树,因此我们不能在原主席树T上扩展,

而是另开一个表示影响的主席树dT并由树状数组来控制更新和查询前缀线段树和

注意更新时dT的下标要遵循树状数组的子集表示方法

查询时留意整个dT下移到儿子的操作

最后祝ZOJ全家Segmentation Fault

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<map>
#define rep(i,j,k) for(int i=j;i<=k;i++)
#define rrep(i,j,k) for(int i=j;i>=k;i--)
#define erep(i,u) for(int i=head[u];~i;i=nxt[i])
#define print(a) printf("%lld",(ll)(a))
#define printbk(a) printf("%lld ",(ll)(a))
#define println(a) printf("%lld\n",(ll)(a))
using namespace std;
const int MAXN = 6e4+11;
const int MAXM = MAXN<<5;
const int MAXT = MAXN; //!!!!
typedef long long ll;
ll read(){
ll x=0,f=1;register char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
} int a[MAXN],b[MAXN],c[MAXN],Q[10006][3],n,m,nn,N;
map<int,int> mp;
char str[1<<5];
const int FLAG = 1e9+7;
struct FST{
int num[MAXM];
int lc[MAXM],rc[MAXM];
int T[MAXN],dT[MAXN],tot;
void init(){
memset(T,0,sizeof T);
memset(dT,0,sizeof dT);
memset(lc,0,sizeof lc);
memset(rc,0,sizeof rc);
memset(num,0,sizeof num);
tot=0;
}
int build(int l,int r){
int cur=++tot;
lc[cur]=rc[cur]=num[cur]=0;
if(l==r) return cur;
int mid=l+r>>1;
lc[cur]=build(l,mid);
rc[cur]=build(mid+1,r);
num[cur]=num[lc[cur]]+num[rc[cur]];
return cur;
}
inline void copy(int cur,int old){
num[cur]=num[old];
lc[cur]=lc[old];
rc[cur]=rc[old];
}
int update(int old,int l,int r,int k,int v){
int cur=++tot;
copy(cur,old);
num[cur]+=v;
if(l==r) return cur;
int mid=l+r>>1;
if(k<=mid) lc[cur]=update(lc[old],l,mid,k,v);
else rc[cur]=update(rc[old],mid+1,r,k,v);
return cur;
}
}fst;
struct FT{
int fstid[MAXT][2];
void init(){
memset(fstid,0,sizeof fstid);
}
inline int lowbit(int x){
return x&-x;
}
void update(int k,int v){
int t=lower_bound(b+1,b+1+N,a[k])-b;
for(int i=k;i<MAXT;i+=lowbit(i)){
fst.dT[i]=fst.update(fst.dT[i],1,N,t,v);
}
}
int query(int k,bool who){
int res=0;
for(int i=k;i>0;i-=lowbit(i)){
res+=fst.num[fst.lc[fstid[i][who]]];
}
return res;
}
}ft;
int query(int st,int ed,int L,int R,int l,int r,int k){
for(int i=L;i>0;i-=ft.lowbit(i)) ft.fstid[i][0]=fst.dT[i];
for(int i=R;i>0;i-=ft.lowbit(i)) ft.fstid[i][1]=fst.dT[i];
while(1){
if(l==r) return l;
int t=fst.num[fst.lc[ed]]-fst.num[fst.lc[st]];
t+=ft.query(R,1);
t-=ft.query(L,0);
if(k<=t){
ed=fst.lc[ed];
st=fst.lc[st];
for(int i=L;i>0;i-=ft.lowbit(i)) ft.fstid[i][0]=fst.lc[ft.fstid[i][0]];
for(int i=R;i>0;i-=ft.lowbit(i)) ft.fstid[i][1]=fst.lc[ft.fstid[i][1]];
r=l+r>>1;
}else{
k-=t;
ed=fst.rc[ed];
st=fst.rc[st];
for(int i=L;i>0;i-=ft.lowbit(i)) ft.fstid[i][0]=fst.rc[ft.fstid[i][0]];
for(int i=R;i>0;i-=ft.lowbit(i)) ft.fstid[i][1]=fst.rc[ft.fstid[i][1]];
l=l+r>>1;l++;
}
}
}
int main(){
//freopen("t.in","r",stdin);
//freopen("t.out","w",stdout);
int T=read();
while(T--){
n=read(); m=read();
mp.clear(); nn=n; ft.init();
rep(i,1,n) b[i]=a[i]=read();
rep(i,1,m){
scanf("%s",str);
Q[i][2]=FLAG;
Q[i][0]=read();
Q[i][1]=read();
if(str[0]=='Q') Q[i][2]=read();
else{
++nn;
b[nn]=a[nn]=Q[i][1];
}
}
sort(b+1,b+1+nn);
N=unique(b+1,b+1+nn)-b-1;
rep(i,1,nn) c[i]=lower_bound(b+1,b+1+N,a[i])-b;
rep(i,1,nn) mp[c[i]]=a[i];
fst.init(); fst.T[0]=fst.build(1,N);
rep(i,1,n) fst.T[i]=fst.update(fst.T[i-1],1,N,c[i],1);
rep(i,1,n) fst.copy(fst.dT[i]=++fst.tot,fst.T[0]);
rep(i,1,m){
if(Q[i][2]!=FLAG){
int L=Q[i][0];
int R=Q[i][1];
int k=Q[i][2];
println(mp[query(fst.T[L-1],fst.T[R],L-1,R,1,N,k)]);
}else{
int k=Q[i][0];
int v=Q[i][1];
ft.update(k,-1);
a[k]=v;
ft.update(k,1);
}
}
}
return 0;
}

ZOJ - 2112 主席树套树状数组的更多相关文章

  1. [luogu2617][bzoj1901][Zju2112]Dynamic Rankings【树套树+树状数组+主席树】

    题目网址 [传送门] 题目大意 请你设计一个数据结构,支持单点修改,区间查询排名k. 感想(以下省略脏话inf个字) 真的强力吹爆洛谷数据,一般的树套树还给我T了一般的点,加强的待修主席树还给我卡了几 ...

  2. [bzoj3196][Tyvj1730]二逼平衡树_树套树_位置线段树套非旋转Treap/树状数组套主席树/权值线段树套位置线段树

    二逼平衡树 bzoj-3196 Tyvj-1730 题目大意:请写出一个维护序列的数据结构支持:查询给定权值排名:查询区间k小值:单点修改:查询区间内定值前驱:查询区间内定值后继. 注释:$1\le ...

  3. UOJ#291. 【ZJOI2017】树状数组 树套树

    原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ291.html 题解 结论:这个写错的树状数组支持的是后缀加和后缀求和.这里的后缀求和在 x = 0 的时 ...

  4. Codechef EDGEST 树套树 树状数组 线段树 LCA 卡常

    原文链接http://www.cnblogs.com/zhouzhendong/p/9016579.html 题目传送门 - Codechef EDGEST 题意 给定相同点集上的两棵生成树$T_1$ ...

  5. BZOJ3110 [Zjoi2013]K大数查询 树套树 线段树 整体二分 树状数组

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ3110 题意概括 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位 ...

  6. BZOJ1452 [JSOI2009]Count 【树套树 (树状数组)】

    1452: [JSOI2009]Count Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 2693  Solved: 1574 [Submit][St ...

  7. [Bzoj3262]陌上花开(CDQ分治&&树状数组||树套树)

    题目链接 题目就是赤裸裸的三维偏序,所以用CDQ+树状数组可以比较轻松的解决,但是还是树套树好想QAQ CDQ+树状数组 #include<bits/stdc++.h> using nam ...

  8. 2019南昌网络赛-I. Yukino With Subinterval 线段树套树状数组,CDQ分治

    TMD...这题卡内存卡的真优秀... 所以以后还是别用主席树的写法...不然怎么死的都不知道... 树套树中,主席树方法开权值线段树...会造成空间的浪费...这道题内存卡的很紧... 由于树套树已 ...

  9. 洛谷P3380 【模板】二逼平衡树(树套树)(线段树+树状数组)

    P3380 [模板]二逼平衡树(树套树) 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 查询k在区间内的排名 查询区间内排名为k的值 修改某一位值上的数 ...

随机推荐

  1. code1214 线段覆盖

    贪心 把线段们按终止点b的先后排序,b小的在前面,b一样随便 然后设r为当前最大的b 每加入一条新的线段i,判断是否重合(i.a>=r) 如果重合就舍弃i,否则把i加入,ans++,更新r:r= ...

  2. code1316 文化之旅

    文化之旅的本质是最短路问题,只不过添加了一个文化排斥,仅需要做最短路时判断一下是否排斥即可 因为数据较小,采用了Floyd算法,以下是代码,关键部分附注释: #include<iostream& ...

  3. Python 简单模块学习

    1. openpyxl / xlrd / xlwt  => 操作Excel 文件(xlsx格式) => xlrd + xlwt : 只能操作xls文件,分别负责读写, 暂时不讨论 => ...

  4. maven环境快速搭建(转)

    出处:http://www.cnblogs.com/fnng/archive/2011/12/02/2272610.html 最近,开发中要用到maven,所以对maven进行了简单的学习.因为有个m ...

  5. java中super的用法

    在Java中,super关键字有2个用法,一个是访问父类的函数,一个是访问父类的变量,总体来说,就是一个功能,访问父类的成员. 代码如下: class Person { String name ; i ...

  6. mysql数据库引擎MyISAM与InnoDB的区别浅说

    mysql的存储引擎包括:MyISAM.InnoDB.BDB.MEMORY.MERGE.EXAMPLE.NDBCluster.ARCHIVE.CSV.BLACKHOLE.FEDERATED等,其中In ...

  7. 编写高质量代码改善C#程序的157个建议——建议79:使用ThreadPool或BackgroundWorker代替Thread

    建议79:使用ThreadPool或BackgroundWorker代替Thread 使用线程能极大地提升用户体验度,但是作为开发者应该注意到,线程的开销是很大的. 线程的空间开销来自: 1)线程内核 ...

  8. nginx+tomcat实现动静态分离

    ===============Tomcat 概述: Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache ...

  9. 解决VS2010中工具箱里没有WPM

    我前段时间要用到MS的WPM,但苦于找不到解决不了,无奈重装后一样的情况我的win7 旗舰版版+VS2010旗舰版.在控制面板里找到多媒体重新关闭并从新打开,就OK啦..记得要重启哦...

  10. (原创)Log4Net 在多层项目中的使用小记

    这几天刚好在调整一个项目,把一些自己不是很清楚的东西先试验一下,这篇文章主要是对我在项目中需要使用Log4Net的一些记录.网上有很多相关的教程,但是各有各的说法,我结合我自己这个项目的需要,首先,项 ...