带修改区间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. ngx_lua 模块

    ngx_lua模块的原理: 1.每个worker(工作进程)创建一个Lua VM,worker内所有协程共享VM:2.将Nginx I/O原语封装后注入 Lua VM,允许Lua代码直接访问:3.每个 ...

  2. (8)学习笔记 ) ASP.NET CORE微服务 Micro-Service ---- Ocelot网关(Api GateWay)

    说到现在现有微服务的几点不足: 1) 对于在微服务体系中.和 Consul 通讯的微服务来讲,使用服务名即可访问.但是对于手 机.web 端等外部访问者仍然需要和 N 多服务器交互,需要记忆他们的服务 ...

  3. ABP+AdminLTE+Bootstrap Table权限管理系统第三节--abp分层体系,实体相关及ABP模块系统

    返回总目录:ABP+AdminLTE+Bootstrap Table权限管理系统一期 ABP模块系统 说了这么久,还没有详细说到abp框架,abp其实基于DDD(领域驱动设计)原则的细看分层如下: 再 ...

  4. Libp2p学习(一)

    Libp2p学习 参考资料:libp2p-specifications : https://github.com/libp2p/specs 持续更新ing 1. 介绍 Libp2p的实现目标是: 支持 ...

  5. Js把Json序列化为Java接受的对象。

    服务器端 Java定义 data class role(var name: String = "", var remark: String = "") data ...

  6. PHP从入门到精通(四)

    PHP数组中的常用函数汇总 为了更直观的讲解各函数的作用和用法,方便大家的理解,首先,我们来定义一个数组.下面各函数的操作将以本数组为例: $arr = array(1,2,3,4,5,6," ...

  7. #个人博客作业week2——关于代码规范的个人观点

    对于这一讨论的前提我们首先要知道什么是代码规范. 在这个问题上我同意一篇参考文章的观点——代码规范不仅只编码风格.编码风格仅是代码规范的一个方面,除了编码风格,代码规范还包括函数返回值等其他方面.在我 ...

  8. Linux内核分析第四周学习总结

    朱国庆+原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 扒开系统调用的三层皮 ...

  9. action中session的存取

    存 ActionContext.getContext().getSession().put("teacherlist", teacherlist); 取 teacherlist=( ...

  10. WebAPI实例--第一个API

    今天终于做了第一个任务,学习API之后的第一个实例.销售设置开发API. 第一.层次结构 1.API各层 项目结构主要有五层,分别为API.BizModel.Data.DBModel.Logic. 2 ...