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. ...
随机推荐
- 使用Pandas_UDF快速改造Pandas代码
1. Pandas_UDF介绍 PySpark和Pandas之间改进性能和互操作性的其核心思想是将Apache Arrow作为序列化格式,以减少PySpark和Pandas之间的开销. Pandas_ ...
- Linux 小记 — Ubuntu 自动化配置
前言 工欲善其事,必先利其器.经过多次的重复配置 ubuntu 开发坏境,我终于决定花点时间总结一下,并将其写成一个自动化配置脚本.服务器实例:ubuntu 16.04,技术栈:shell,pytho ...
- 【数据库】Mysql中主键的几种表设计组合的实际应用效果
写在前面 前前后后忙忙碌碌,度过了新工作的三个月.博客许久未新,似乎对忙碌没有一点点防备.总结下来三个月不断的磨砺自己,努力从独乐乐转变到众乐乐,体会到不一样的是,连办公室的新玩意都能引起莫名的兴趣了 ...
- LVM : 缩减文件系统的容量
有扩展就有缩减,我们在前文<LVM : 扩展文件系统的容量>中介绍了通过 LVM 扩展文件系统的方法,本文我们接着前文的 demo 介绍通过 LVM 缩减文件系统的方法.说明:本文的演示环 ...
- JMeter:响应结果乱码解决方法
JMeter:响应结果乱码解决方法 我们经常使用jmeter做接口测试或者正则匹配 看到的响应结果存在乱码,这是小白经常会问的问题,这是因为jmeter会按照jmeter.properties文件中, ...
- centos下部署redis服务环境及其配置说明
Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API.从2010年3月15日起,Redis的开发工作由VMware主 ...
- 软件工程启程篇章:结对编程和进阶四则运算(197 & 199)
0x01 :序言:无关的事 I wrote a sign called "Dead End" in front of myself, but love crossed it wit ...
- 团队作业Week14——源代码管理
0. 在吹牛之前,先回答这个问题: 如果你的团队来了一个新队员,有一台全新的机器, 你们是否有一个文档,只要设置了相应的权限,她就可以根据文档,从头开始搭建环境,并成功地把最新.最稳定版本的软件编译出 ...
- QT下opencv的编译和使用
需要的文件 qt-opensource-windows-x86-mingw491_opengl-5.4.0.exe cmake-3.12.0-rc1-win64-x64.msi opencv-2.4. ...
- Java日志输出问题
以前有一个同事,说自己的Java控制台程序,输出的信息,打印信息以及错误信息,在windows的command line刷屏,想复制下来,想要自输出到日志文件里. 自己写文件太麻烦,他从网上只找到用重 ...