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. bzoj3796(后缀数组)(SA四连)

    bzoj3796Mushroom追妹纸 题目描述 Mushroom最近看上了一个漂亮妹纸.他选择一种非常经典的手段来表达自己的心意——写情书.考虑到自己的表达能力,Mushroom决定不手写情书.他从 ...

  2. #1014 : Trie树 HihoCoder(字典树)

    描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在编程的学习道路上一同前进. 这一天,他们遇到了一本词典,于是小Hi就向小Ho提出了那个经典的问题: ...

  3. Dos 批处理 Shutdown

    第一步: win + R,打开"运行" 第二步: 输入cmd 第三步: 输入color a或color b改成自己喜欢的颜色 第四步: 在shutdown后面输入不同的命令达到不同 ...

  4. Shiro中的Remember me设置

    1. 在Spring的相关配置文件中加入如下Remember me管理器配置: <!-- rememberMe管理器 --> <bean id="rememberMeMan ...

  5. Typescript学习笔记(四)class 类

    typescript的类,与c#,java等语言的类类似.也是包含了一大部分的es6的实现.我会用最通俗的语言讲一下对coding有用的地方. class Greeter { greeting: st ...

  6. 洛谷P3265 装备购买

    这个大毒瘤题....居然反向卡精度.... 别的题eps要开小,这个毒瘤要开大... 我一开始是1e-12,挂的奇惨无比,50分...... 然后改成1e-7,就70分了... 1e-5 90分 1e ...

  7. HDU3032 Nim or not Nim?

    解:使用sg函数打表发现规律,然后暴力异或起来即可. #include <bits/stdc++.h> typedef long long LL; ; int a[N]; inline L ...

  8. java 红黑树

    背景:总结面试中关于红黑树的相关题目 红黑树(一)之 原理和算法详细介绍 漫画:什么是红黑树? 红黑树是一种自平衡的二叉查找树 红黑树的5个特征:根.叶子都是黑的 节点非红即黑.不能是连续红的.节点到 ...

  9. (九)逻辑运算,order by,desc

    逻辑运算 AND,OR,NOT ......where 表达式1  and 表达式2: ......where 表达式2  and 表达式1: SQL优化: SQL在解析where时是从右向左解析的. ...

  10. react-native中使用长列表

    React Native 提供了几个适用于展示长列表数据的组件,一般而言我们会选用FlatList或是SectionList. FlatList组件用于显示一个垂直的滚动列表,其中的元素之间结构近似而 ...