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. redis健康检查与故障转移

    哨兵三个定时监控任务 每隔10s每隔sentinel节点会向主节点和从节点发送info命令获取最新的拓扑结构 每隔2S,每个sentinel节点会向redis数据节点的__sentiel__:hell ...

  2. Linux系统状态监控小工具 - Linux Dash

    Linux Dash是一个简单易用的Linux系统状态监控工具,项目地址:https://github.com/afaqurk/linux-dash 1.安装Apache服务: [root@local ...

  3. 洛谷P2150 寿司晚宴

    解:发现每个质数只能属于一个人,于是想到每个质数有三种情况:属于a,属于b,都不属于. 然后考虑状压每个人的质数集合,可以得到30分. 转移就是外层枚举每个数,内层枚举每个人的状态,然后看能否转移.能 ...

  4. A1046. Shortest Distance

    The task is really simple: given N exits on a highway which forms a simple cycle, you are supposed t ...

  5. 【洛谷P1303 A*B Problem】

    题目描述 求两数的积. 输入输出格式 输入格式: 两行,两个数. 输出格式: 积 输入输出样例 输入样例#1: 1 2 输出样例#1: 2 说明 每个数字不超过10^2000,需用高精 emm,显然本 ...

  6. Ubuntu下安装Goldendict(翻译软件)

    Ubuntu直接安装 sudo apt-get install goldendict 通过源码安装 失败 下载词典 http://blog.sina.com.cn/s/blog_c58823b3010 ...

  7. poj 2385 Apple Catching(记录结果再利用的动态规划)

    传送门 https://www.cnblogs.com/violet-acmer/p/9852294.html 题意: 有两颗苹果树,在每一时刻只有其中一棵苹果树会掉苹果,而Bessie可以在很短的时 ...

  8. 二进制部署 Kubernetes 集群

    二进制部署 Kubernetes 集群   提供的几种Kubernetes部署方式 minikube Minikube是一个工具,可以在本地快速运行一个单点的Kubernetes,尝试Kubernet ...

  9. css换行

    1. word-break:break-all;只对英文起作用,以字母作为换行依据 2. word-wrap:break-word; 只对英文起作用,以单词作为换行依据 3. white-space: ...

  10. Advertising.csv

    TV,radio,newspaper,sales1,230.1,37.8,69.2,22.12,44.5,39.3,45.1,10.43,17.2,45.9,69.3,9.34,151.5,41.3, ...