luogu3380/bzoj3196 二逼平衡树 (树状数组套权值线段树)
带修改区间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 二逼平衡树 (树状数组套权值线段树)的更多相关文章
- CF1093E Intersection of Permutations 树状数组套权值线段树
\(\color{#0066ff}{ 题目描述 }\) 给定整数 \(n\) 和两个 \(1,\dots,n\) 的排列 \(a,b\). \(m\) 个操作,操作有两种: \(1\ l_a\ r_a ...
- BZOJ2141排队——树状数组套权值线段树(带修改的主席树)
题目描述 排排坐,吃果果,生果甜嗦嗦,大家笑呵呵.你一个,我一个,大的分给你,小的留给我,吃完果果唱支歌,大家 乐和和.红星幼儿园的小朋友们排起了长长地队伍,准备吃果果.不过因为小朋友们的身高有所区别 ...
- Dynamic Rankings(树状数组套权值线段树)
Dynamic Rankings(树状数组套权值线段树) 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[ ...
- [BZOJ 3295] [luogu 3157] [CQOI2011]动态逆序对(树状数组套权值线段树)
[BZOJ 3295] [luogu 3157] [CQOI2011] 动态逆序对 (树状数组套权值线段树) 题面 给出一个长度为n的排列,每次操作删除一个数,求每次操作前排列逆序对的个数 分析 每次 ...
- 【树状数组套权值线段树】bzoj1901 Zju2112 Dynamic Rankings
谁再管这玩意叫树状数组套主席树我跟谁急 明明就是树状数组的每个结点维护一棵动态开结点的权值线段树而已 好吧,其实只有一个指针,指向该结点的权值线段树的当前结点 每次查询之前,要让指针指向根结点 不同结 ...
- 刷题总结——骑士的旅行(bzoj4336 树链剖分套权值线段树)
题目: Description 在一片古老的土地上,有一个繁荣的文明. 这片大地几乎被森林覆盖,有N座城坐落其中.巧合的是,这N座城由恰好N-1条双 向道路连接起来,使得任意两座城都是连通的.也就是说 ...
- 【bzoj3065】带插入区间K小值 替罪羊树套权值线段树
题目描述 从前有n只跳蚤排成一行做早操,每只跳蚤都有自己的一个弹跳力a[i].跳蚤国王看着这些跳蚤国欣欣向荣的情景,感到非常高兴.这时跳蚤国王决定理性愉悦一下,查询区间k小值.他每次向它的随从伏特提出 ...
- LightOJ 1085(树状数组+离散化+DP,线段树)
All Possible Increasing Subsequences Time Limit:3000MS Memory Limit:65536KB 64bit IO Format: ...
- HDU 1934 树状数组 也可以用线段树
http://acm.hdu.edu.cn/showproblem.php?pid=1394 或者是我自己挂的专题http://acm.hust.edu.cn/vjudge/contest/view. ...
随机推荐
- Centos下SFTP双机高可用环境部署记录
SFTP(SSH File Transfer Protocol),安全文件传送协议.有时也被称作 Secure File Transfer Protocol 或 SFTP.它和SCP的区别是它允许用户 ...
- restfull环境搭建-helloword(二)
原文地址:http://only81.iteye.com/blog/1689537 本文描述,获取XML或json格式数据 首先,创建一个bean,比如Todo(JAXB自动将bean文件,转换成xm ...
- 百度之星-day1-1003-度度熊剪纸条
度度熊剪纸条 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Subm ...
- poj1426 Find The Multiple(c语言巧解)
Find The Multiple Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 36335 Accepted: 151 ...
- 个人博客作业_week3
一. 评测 1.对方背景 这个好像大家都不一样,他要考四级啊,考六级啊,出国啊,或者平时写代码看不懂错误信息(呵呵)(还有可能是为了完成某次作业而用的....), 等等,所以是会用的.一般的问题都能解 ...
- 《Linux内核分析》第八周笔记 进程的切换和系统的一般执行过程
20135132陈雨鑫 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ...
- The Contest CodeForces - 813A (思维)
Pasha is participating in a contest on one well-known website. This time he wants to win the contest ...
- slf4j的java包冲突问题
- 面象对象设计原则之五:依赖倒置原则(The Dependency Inversion Principle,DIP)
如果说开闭原则是面向对象设计的目标的话,那么依赖倒转原则就是面向对象设计的主要实现机制之一,它是系统抽象化的具体实现.依赖倒转原则是Robert C. Martin在1996年为“C++Reporte ...
- GitLab添加ssh-key,操作无需每次输入账号密码
git config --global credential.helper store 然后操作pull/push 会让输入用户名密码,第一次输入进去.下次再操作pull/push时就不需要输入用户名 ...