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. ...
随机推荐
- Luogu P1306 斐波那契公约数
这道题其实是真的数学巨佬才撸的出来的题目了 但如果只知道结论但是不知道推导过程的我感觉证明无望 首先这道题肯定不能直接搞,而且题目明确说明了一些方法的问题 所以就暗示我们直接上矩阵了啦 但是如果直接搞 ...
- JDK8漫谈——代码更优雅
简介 lambda表达式,又称闭包(Closure)或称匿名方法(anonymous method).将Lambda表达式引入JAVA中的动机源于一个叫"行为参数"的模式.这种模式 ...
- JavaScript如何实现继承
// 原型方式的'继承' function Person(name) { //定义一个Person的构造函数 this.name = name; //添加属性 } Person.prototype.s ...
- 基于RC4加密算法的图像加密
基于RC4加密算法的图像加密 某课程的一个大作业内容,对图像加密.项目地址:https://gitee.com/jerry323/RC4_picture 这里使用的是RC4(流.对称)加密算法,算法流 ...
- Linux内核分析— —扒开系统调用的三层皮(下)
课程主要内容有三点: 在MenuOS中通过添加代码增加自定义的系统调用命令 使用gdb跟踪调试内核 简单分析system_call代码了解系统调用在内核代码中的处理过程 实验——分析system_ca ...
- LINUX第三次实践:程序破解
LINUX第三次实践:程序破解 标签(空格分隔): 20135328陈都 一.掌握NOP.JNE.JE.JMP.CMP汇编指令的机器码 NOP:NOP指令即"空指令".执行到NOP ...
- JQuery Cross Domain Ajax(jsonp)
http://www.pureexample.com/jquery/cross-domain-ajax.html http://www.pureexample.com/ExampleTesterII- ...
- FreeMarker has_content等价于StringUtils.isNotNullOrEmpty
has_content It is true if the variable exists (and isn't Java null) and is not "empty", ot ...
- BFC——块级格式化上下文
BFC(块级格式化上下文) 一.BFC是什么? 从样式上看,具有BFC的容器和普通的容器没有区别.从功能上看,具有BFC的容器可以看作是隔离了的容器,容器里面的元素不会影响到外面的元素,并且BFC具有 ...
- 关于mybatis的@Param注解和参数
1,使用@Param注解 当以下面的方式进行写SQL语句时: @Select("select column from table where userid = #{userid} " ...