带修改区间K大值

这题有很多做法,我的做法是树状数组套权值线段树,修改查询的时候都是按着树状数组的规则找出那log(n)个线段树根,然后一起往下做

时空都是$O(nlog^2n)$的(如果离散化了的话),空间可能会被卡,但实际上点数不用开到特别大,N*200也能过

 #include<bits/stdc++.h>
#define pa pair<int,int>
#define CLR(a,x) memset(a,x,sizeof(a))
using namespace std;
typedef long long ll;
const int maxn=5e4+,maxp=maxn*,inf=1e8; inline ll rd(){
ll x=;char c=getchar();int neg=;
while(c<''||c>''){if(c=='-') neg=-;c=getchar();}
while(c>=''&&c<='') x=x*+c-'',c=getchar();
return x*neg;
} int root[maxn],ch[maxp][],v[maxp],pct;
int num[maxn],tmp1[maxn],tmp2[maxn],N,M; inline int lowbit(int x){return x&(-x);} inline void update(int p){v[p]=v[ch[p][]]+v[ch[p][]];}
inline void add(int &p,int l,int r,int x,int y){
if(!p) p=++pct;
if(l==r) v[p]+=y;
else{
int m=l+r>>;
if(x<=m) add(ch[p][],l,m,x,y);
else add(ch[p][],m+,r,x,y);
update(p);
}
}
inline void change(int x,int y){
int ori=num[x];
for(;x<=N;x+=lowbit(x)){
if(ori!=-) add(root[x],,inf,ori,-);
add(root[x],,inf,y,);
}
} inline void reset(int x,int y){
for(;y;y-=lowbit(y)) tmp1[y]=root[y];
for(;x;x-=lowbit(x)) tmp2[x]=root[x];
}
inline bool pushdown(int x,int y,bool b){
bool re=;
for(;y;y-=lowbit(y)) tmp1[y]=ch[tmp1[y]][b],re|=tmp1[y];
for(;x;x-=lowbit(x)) tmp2[x]=ch[tmp2[x]][b],re|=tmp2[x];
return re;
} int query1(int l,int r,int x,int y,int k){
if(k<) return ;
if(l==r) return ;
int m=l+r>>;
if(k<=m){
if(!pushdown(x,y,)) return ;
return query1(l,m,x,y,k);
}else{
int w=;
for(int i=y;i;i-=lowbit(i)) w+=v[ch[tmp1[i]][]];
for(int i=x;i;i-=lowbit(i)) w-=v[ch[tmp2[i]][]];
if(!pushdown(x,y,)) return w+;
return w+query1(m+,r,x,y,k);
}
}
int query2(int l,int r,int x,int y,int k){
if(k<=) return -;
int w=;
for(int i=y;i;i-=lowbit(i)) w+=v[tmp1[i]];
for(int i=x;i;i-=lowbit(i)) w-=v[tmp2[i]];
if(w<k) return -;
if(l==r) return l;
int m=l+r>>;w=;
for(int i=y;i;i-=lowbit(i)) w+=v[ch[tmp1[i]][]];
for(int i=x;i;i-=lowbit(i)) w-=v[ch[tmp2[i]][]];
if(k<=w){
pushdown(x,y,);
return query2(l,m,x,y,k);
}else{
pushdown(x,y,);
return query2(m+,r,x,y,k-w);
}
} int main(){
//freopen(".in","r",stdin);
int i,j,k;
N=rd(),M=rd();
CLR(num,-);
for(i=;i<=N;i++){
int x=rd();
change(i,x);num[i]=x;
}
for(i=;i<=M;i++){
int a=rd(),b=rd(),c=rd();
if(a==){
change(b,c);num[b]=c;
}else{
int d=rd();
if(a==){
reset(b-,c);
printf("%d\n",query1(,inf,b-,c,d));
}else if(a==){
reset(b-,c);
printf("%d\n",query2(,inf,b-,c,d));
}else if(a==){
reset(b-,c);
int rk=query1(,inf,b-,c,d);
reset(b-,c);
if(rk==) printf("-2147483647\n");
else printf("%d\n",query2(,inf,b-,c,rk-));
}else if(a==){
reset(b-,c);
int rk=query1(,inf,b-,c,d+);
reset(b-,c);
int re=query2(,inf,b-,c,rk);
if(re==-) printf("2147483647\n");
else printf("%d\n",re);
}
}
}
return ;
}

luogu3380/bzoj3196 二逼平衡树 (树状数组套权值线段树)的更多相关文章

  1. CF1093E Intersection of Permutations 树状数组套权值线段树

    \(\color{#0066ff}{ 题目描述 }\) 给定整数 \(n\) 和两个 \(1,\dots,n\) 的排列 \(a,b\). \(m\) 个操作,操作有两种: \(1\ l_a\ r_a ...

  2. BZOJ2141排队——树状数组套权值线段树(带修改的主席树)

    题目描述 排排坐,吃果果,生果甜嗦嗦,大家笑呵呵.你一个,我一个,大的分给你,小的留给我,吃完果果唱支歌,大家 乐和和.红星幼儿园的小朋友们排起了长长地队伍,准备吃果果.不过因为小朋友们的身高有所区别 ...

  3. Dynamic Rankings(树状数组套权值线段树)

    Dynamic Rankings(树状数组套权值线段树) 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[ ...

  4. [BZOJ 3295] [luogu 3157] [CQOI2011]动态逆序对(树状数组套权值线段树)

    [BZOJ 3295] [luogu 3157] [CQOI2011] 动态逆序对 (树状数组套权值线段树) 题面 给出一个长度为n的排列,每次操作删除一个数,求每次操作前排列逆序对的个数 分析 每次 ...

  5. 【树状数组套权值线段树】bzoj1901 Zju2112 Dynamic Rankings

    谁再管这玩意叫树状数组套主席树我跟谁急 明明就是树状数组的每个结点维护一棵动态开结点的权值线段树而已 好吧,其实只有一个指针,指向该结点的权值线段树的当前结点 每次查询之前,要让指针指向根结点 不同结 ...

  6. 刷题总结——骑士的旅行(bzoj4336 树链剖分套权值线段树)

    题目: Description 在一片古老的土地上,有一个繁荣的文明. 这片大地几乎被森林覆盖,有N座城坐落其中.巧合的是,这N座城由恰好N-1条双 向道路连接起来,使得任意两座城都是连通的.也就是说 ...

  7. 【bzoj3065】带插入区间K小值 替罪羊树套权值线段树

    题目描述 从前有n只跳蚤排成一行做早操,每只跳蚤都有自己的一个弹跳力a[i].跳蚤国王看着这些跳蚤国欣欣向荣的情景,感到非常高兴.这时跳蚤国王决定理性愉悦一下,查询区间k小值.他每次向它的随从伏特提出 ...

  8. LightOJ 1085(树状数组+离散化+DP,线段树)

    All Possible Increasing Subsequences Time Limit:3000MS     Memory Limit:65536KB     64bit IO Format: ...

  9. HDU 1934 树状数组 也可以用线段树

    http://acm.hdu.edu.cn/showproblem.php?pid=1394 或者是我自己挂的专题http://acm.hust.edu.cn/vjudge/contest/view. ...

随机推荐

  1. item 2: 理解auto类型的推导

    本文翻译自modern effective C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 如果你已经读过item 1的模板类型推导,你已经知道大部分关于au ...

  2. MVC 使用cshtml的一些基础知识-和相关整理

    首先在认识cshtml之前,先要了解一下Razor视图引擎 如果对此有疑问的话可以借鉴 博客园博文:http://kb.cnblogs.com/page/96883/ 或 博客博文:http://ww ...

  3. 系统重启后DNS地址默认修改修改引起的一次事故(Tomcat报错:java.net.UnknownHostException)

    事故描述:公司的一个内部业务系统由于程序bug,导致系统崩溃,需要强制重启服务器.系统重启后,赶紧将业务程序启动.随后发现/etc/resolv.conf文件的DNS地址被修改成了默认地址.发现之后, ...

  4. Redis+TwemProxy(nutcracker)集群方案部署记录

    Twemproxy 又称nutcracker ,是一个memcache.Redis协议的轻量级代理,一个用于sharding 的中间件.有了Twemproxy,客户端不直接访问Redis服务器,而是通 ...

  5. tmux使用总结

    ctrl+b +%:增加垂直分屏 ctlr+b +左右箭头: 在垂直分屏中移动 ctrl+b+c:新建窗口(不分屏) ctrl+b+数字键: 切换窗口 ctrl+b+d: 断开窗口 tmux  a : ...

  6. B. Heaters Div3

    链接 [http://codeforces.com/contest/1066/problem/B] 分析 具体看代码,贪就完事了 代码 #include<bits/stdc++.h> us ...

  7. 《Linux内核分析》第八周学习笔记

    <Linux内核分析>第八周学习笔记 进程的切换和系统的一般执行过程 郭垚 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163 ...

  8. 《Linux课本》读书笔记 第四章

  9. 递归拼装Tree结构数据

    @Override public List<Map<String, Object>> queryListTree() { List<Map<String,Objec ...

  10. MYSQL jdbc autoReconnect

    http://blog.csdn.net/a9529lty/article/details/7104351 http://blog.163.com/huangfei_person/blog/stati ...