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. tvs二极管应用电路

    瞬态电压抑制器(TVS)具有响应时间快.瞬态功率大.漏电流低.击穿电压偏差小.箝位电压较易控制.无损坏极限.体积小等优点.目前已广泛应用于计算机系统.通讯设备.交/直流电源.汽车.家用电器.仪器仪表等 ...

  2. HTML5新特性:FileReader 和 FormData

    连接在这里: HTML5新特性:FileReader 和 FormData

  3. 初入webform的杂七杂八

    客户端---IIS(Internet Information Services的缩写,意为互联网信息服务管理器)---.NET framework---数据库 1.Repeater控件:对应的集合有5 ...

  4. A1138. Postorder Traversal

    Suppose that all the keys in a binary tree are distinct positive integers. Given the preorder and in ...

  5. [luogu4626][一道水题2]

    题目链接 思路 这个首先想到质因数分解.然后发现只要对于每个质数将ans乘以这个质数在从1到n中出现过的最高指数次就行了. 这个\(10^8\)令人发指.一直tle,最后发现吸口氧才能过.. 代码 # ...

  6. html 网页背景图片根据屏幕大小CSS自动缩放

    https://blog.csdn.net/coslay/article/details/47109281 腾讯微博和QQ空间的登录背景图片是根据访客的屏幕大小自动缩放的,但是好像是用JQuery代码 ...

  7. 最短路 次短路 k短路(k很小)

    最短路 luogu 3371 https://www.luogu.org/problemnew/show/P3371 #include <cstdio> #include <cstd ...

  8. operator new和operator delete

    从STL源码剖析中看到了operator new的使用 template<class T> inline void _deallocate(T* buffer) { ::operator ...

  9. jQuery实现表格行的动态增加与删除(改进版)

    之前写过一个简单的利用jQuery实现表格行的动态增加与删除的例子,有些人评论说"如果表格中是input元素,那么删除后的东西都将自动替换,这样应该是有问题的,建议楼主改进!",故 ...

  10. C# string.format用法详解

    String.Format 方法的几种定义: String.Format (String, Object) 将指定的 String 中的格式项替换为指定的 Object 实例的值的文本等效项. Str ...