Description

给定一个含有n个数的序列a[1],a[2],a[3]……a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i+2]……a[j]中第k小的数是多少(1≤k≤j-i+1),并且,你可以改变一些a[i]的值,改变后,程序还能针对改变后的a继续回答上面的问题。

Input

第一行有两个正整数n(1≤n≤10000),m(1≤m≤10000)。
分别表示序列的长度和指令的个数。
第二行有n个数,表示a[1],a[2]……a[n],这些数都小于10^9。
接下来的m行描述每条指令
每行的格式是下面两种格式中的一种。 
Q i j k 或者 C i t 
Q i j k (i,j,k是数字,1≤i≤j≤n, 1≤k≤j-i+1)
表示询问指令,询问a[i],a[i+1]……a[j]中第k小的数。
C i t (1≤i≤n,0≤t≤10^9)表示把a[i]改变成为t
m,n≤10000

Output

对于每一次询问,你都需要输出他的答案,每一个输出占单独的一行。

Sample Input

5 3
3 2 1 4 7
Q 1 4 3
C 2 6
Q 2 5 3

Sample Output

3
6

带修改的整体二分……整体二分不会改变操作顺序,把修改也加进操作就可以了√

 #include<cstdio>
#include<algorithm>
#include<cstring>
#define LL long long
using namespace std;
const int N=5e4+;
const int inf=1e9;
int n,m,cnt,qid,id,temp,x[N],ans[N],tr[N];
bool f[N];
char ch[];
struct node{int op,l,r,k,num;}a[N],tmp[N];
int lowbit(int x){return x&(-x);}
void insert(int x,int c){while(x<=n)tr[x]+=c,x+=lowbit(x);}
int query(int x){int ans=;while(x)ans+=tr[x],x-=lowbit(x);return ans;}
int read()
{
int x=,f=;char c=getchar();
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
}
void work(int ql,int qr,int L,int R)
{
if(ql>qr||L>R)return;
if(L==R){for(int i=ql;i<=qr;i++)if(a[i].op)ans[a[i].num]=L;return;}
int mid=(L+R)>>,h1=ql,h2=ql;
for(int i=ql;i<=qr;i++)
if(a[i].op)
{
temp=query(a[i].r)-query(a[i].l-);
if(temp>=a[i].k)f[i]=true,h2++;
else f[i]=false,a[i].k-=temp;
}
else
{
if(a[i].num<=mid)f[i]=true,h2++,insert(a[i].l,a[i].k);
else f[i]=false;
}
for(int i=ql;i<=qr;i++)if((!a[i].op)&&f[i])insert(a[i].l,-a[i].k);
for(int i=ql;i<=qr;i++)
if(f[i])tmp[h1++]=a[i];
else tmp[h2++]=a[i];
for(int i=ql;i<=qr;i++)a[i]=tmp[i];
work(ql,h1-,L,mid);work(h1,qr,mid+,R);
}
int main()
{
n=read();m=read();
for(int i=;i<=n;i++)x[i]=read(),a[++cnt]=(node){,i,,,x[i]};
for(int i=;i<=m;i++)
{
scanf("%s",ch+);
if(ch[]=='Q')
{
a[++cnt].op=;a[cnt].num=++qid;
a[cnt].l=read();a[cnt].r=read();a[cnt].k=read();
}
else
{
id=read();temp=read();
a[++cnt]=(node){,id,,-,x[id]};
a[++cnt]=(node){,id,,,x[id]=temp};
}
}
work(,cnt,-inf,inf);
for(int i=;i<=qid;i++)printf("%d\n",ans[i]);
return ;
}

带修改的主席树……外面要套个树状数组。

 #include<cstdio>
#include<algorithm>
#include<cstring>
#define LL long long
using namespace std;
const int N=2e4+;
int n,m,cnt,tot,id,tx,ty;
int A[N],B[N],C[N],a[N],tmp[N],rt[N],xx[N],yy[N];
int lc[N*],rc[N*],sum[N*];
char op[];
int read()
{
int x=,f=;char c=getchar();
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
}
int lowbit(int x){return x&(-x);}
void ins(int& x,int last,int L,int R,int num,int c)
{
x=++tot;lc[x]=lc[last];rc[x]=rc[last];sum[x]=sum[last]+c;
if(L==R)return;int mid=(L+R)>>;
if(num<=mid)ins(lc[x],lc[last],L,mid,num,c);
else ins(rc[x],rc[last],mid+,R,num,c);
}
void add(int x,int c)
{
id=lower_bound(tmp+,tmp+cnt+,a[x])-tmp;
for(int i=x;i<=n;i+=lowbit(i))ins(rt[i],rt[i],,cnt,id,c);
}
int query(int L,int R,int num)
{
if(L==R)return L;
int ans=,mid=(L+R)>>;
for(int i=;i<=tx;i++)ans-=sum[lc[xx[i]]];
for(int i=;i<=ty;i++)ans+=sum[lc[yy[i]]];
if(num<=ans)
{
for(int i=;i<=tx;i++)xx[i]=lc[xx[i]];
for(int i=;i<=ty;i++)yy[i]=lc[yy[i]];
return query(L,mid,num);
}
else
{
for(int i=;i<=tx;i++)xx[i]=rc[xx[i]];
for(int i=;i<=ty;i++)yy[i]=rc[yy[i]];
return query(mid+,R,num-ans);
}
}
int main()
{
n=read();m=read();cnt=n;
for(int i=;i<=n;i++)tmp[i]=a[i]=read();
for(int i=;i<=m;i++)
{
scanf("%s",op+);
A[i]=read();B[i]=read();
if(op[]=='Q')C[i]=read();
else tmp[++cnt]=B[i];
}
sort(tmp+,tmp+cnt+);
cnt=unique(tmp+,tmp+cnt+)-tmp-;
for(int i=;i<=n;i++)add(i,);
for(int i=;i<=m;i++)
if(C[i])
{
tx=ty=;
for(int j=A[i]-;j;j-=lowbit(j))xx[++tx]=rt[j];
for(int j=B[i];j;j-=lowbit(j))yy[++ty]=rt[j];
printf("%d\n",tmp[query(,cnt,C[i])]);
}
else add(A[i],-),a[A[i]]=B[i],add(A[i],);
return ;
}

【bzoj 1901】Zju2112 Dynamic Rankings的更多相关文章

  1. 【BZOJ 1901】Zju2112 Dynamic Rankings &&【COGS 257】动态排名系统 树状数组套线段树

    外面是树状数组,里面是动态开点线段树,对于查询我们先把有关点找出来,然后一起在线段树上行走,这样就是单个O(log2)的了 #include <cstdio> #include <v ...

  2. 【BOZJ 1901】Zju2112 Dynamic Rankings

    Description 给定一个含有n个数的序列a[1],a[2],a[3]……a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i+2]……a[j]中第k小的数是 ...

  3. 【BZOJ1901】Zju2112 Dynamic Rankings 主席树+树状数组

    [BZOJ1901]Zju2112 Dynamic Rankings Description 给定一个含有n个数的序列a[1],a[2],a[3]……a[n],程序必须回答这样的询问:对于给定的i,j ...

  4. 动态主席树【带修改】&& 例题 Dynamic Rankings ZOJ - 2112

    参考链接:https://blog.csdn.net/WilliamSun0122/article/details/77885781 一.动态主席树介绍 动态主席树与静态主席树的不同在于:静态主席树不 ...

  5. 【BZOJ 1901】【ZJU 2112】Dynamic Rankings

    http://www.lydsy.com/JudgeOnline/problem.php?id=1901 重新用整体二分写了一下. 整体二分的思想详见论文. 貌似带修区间k大和静态区间k大都是\(O( ...

  6. 【BZOJ 1901】【Zju 2112】 Dynamic Rankings 动态K值 树状数组套主席树模板题

    达神题解传送门:http://blog.csdn.net/dad3zz/article/details/50638360 说一下我对这个模板的理解: 看到这个方法很容易不知所措,因为动态K值需要套树状 ...

  7. 【BZOJ1901】 Zju2112 Dynamic Rankings(树套树)

    [题意] 给定一个含有n个数的序列a[1],a[2],a[3]--a[n], 程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i+2]--a[j]中第k小的数是多少(1≤k ...

  8. 【BZOJ1901】Zju2112 Dynamic Rankings

    Description 给定一个含有n个数的序列a[1],a[2],a[3]……a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i+2]……a[j]中第k小的数是 ...

  9. 【bzoj1901】Zju2112 Dynamic Rankings 离散化+主席树+树状数组

    题目描述 给定一个含有n个数的序列a[1],a[2],a[3]……a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i+2]……a[j]中第k小的数是多少(1≤k≤ ...

随机推荐

  1. NOIP 飞扬的小鸟 题解

    题目描述 Flappy Bird是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小鸟顺利通过画面右方的管道缝隙.如果小鸟一不小心撞到了水管或者掉在地上的话,便宣 ...

  2. 如何 通过 userAgent 区别微信小程序

    微信内置浏览器: 微信小程序: 有micromessenger是微信内置浏览器,有micromessenger和miniprogram的是微信小程序.  (ios不适用) if(navigator.u ...

  3. JAVA 微信支付 native方式

    最近做了一个微信native方式支付的demo,整理一下. 首先到微信公众号官网阅读开发文档,虽然文档对于java没有例子,但是也可以作参考.https://pay.weixin.qq.com/wik ...

  4. 新建工程时报错(26, 13) Failed to resolve: com.android.support:appcompat-v7:28.+ ,

    allprojects { repositories { jcenter() maven { url "https://maven.google.com" } } }

  5. selinux 的使用

    SELinux 的启动.关闭与查看 1,并非所有的 Linux distributions 都支持 SELinux 的 目前 SELinux 支持三种模式,分别如下: •enforcing:强制模式, ...

  6. node.js小案例_留言板

    一.前言 通过这个案例复习: 1.node.js中模板引擎的使用 2.node.js中的页面跳转和重定向 二.主要内容 1.案列演示:  2.案列源码:https://github.com/45612 ...

  7. 字符缓冲流BufferedWriter BufferedReader

    //字符缓冲流主要用于文本数据的高速写入 package cn.lijun.demo1; import java.io.BufferedReader; import java.io.FileNotFo ...

  8. 这3周以来的面试总结(C#/.net 智能硬件/物联网)

    2017.3找工作面试记录-第一周 2017.3找工作面试记录-第一周(2) 2017.3找工作面试记录-第二周 2017.4找工作面试记录-第三周 2017.4找工作面试记录-第三周(2)--金蝶 ...

  9. 兄弟连Linux运维学习笔记

    最新经典linux运维兄弟连Linux运维学习笔记... --------------- 全程1.5倍播放.加油我一定可以学完Linux----------------------Unix与Linux ...

  10. MySQL_函数(待续)

    1.REPLACE(str,from_str,to_str) 定义:REPLACE(str,from_str,to_str) 解释:返回值是把字符串str 中的子串from_str 全部替换为to_s ...