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. Fiddler 安装配置及使用技巧

    下载最新版即可: https://www.telerik.com/fiddler pc配置: pc端上的配置较为简单,主要是记录一下遇到的一些bug以及解决方法. options>HTTPS  ...

  2. 【POJ2411】Mondriaan's Dream

    题目大意:给定一个 N*M 的棋盘,用 1*2 的木条填满有多少种不同的方式. 题解:在这里采用以行为阶段进行状压 dp.到第 i 行时,1*1 的木块分成两类,第一类是这个木块是竖着放置木条的上半部 ...

  3. Django 配置数据库

    Django提到配置那大多数都是在settings.py配置文件 在配置文件里的 DATABASES 内进行设置 # 数据库配置 DATABASES = { #连接mysql 'default': { ...

  4. JDBC动态查询MySQL中的表(按条件筛选)

    动态查询实现按条件筛选.PreparedStatement 准备语句指定要查询的表头列,.setString()通过赋值指定行,.executeQuery()执行语句 在数据库test里先创建表sch ...

  5. JDBC 增、改、删 MySQL中的表

    在数据库test里先创建表school,内容如下 通过JDBC增加第五人tom,修改他的生日,最后删除tom import java.sql.Connection; import java.sql.D ...

  6. 位掩码(BitMask)的介绍与使用

    一.前言 位运算在我们实际开发中用得很少,主要原因还是它对于我们而言不好读.不好懂.也不好计算,如果不经常实践,很容易就生疏了.但实际上,位运算是一种很好的运算思想,它的优点自然是计算快,代码更少. ...

  7. python: 反射机制;

    import comma def run(): inp = input('请输入要调用的函数').strip(); if hasattr(comma,inp): fun = getattr(comma ...

  8. qml: 模块定义与使用

    1. 模块的定义qmldir Module   MyModule MyTest  1.0  MyTest.qml MyTest  1.3  MyTest.qml 2. 导入: 使用qrc: RESOU ...

  9. Hibernate的入门(增删改查):

    注意:本次的记录是在上一篇Hibernate入门的基础上应用的 1.目录 2.实体类修改 package com.itheima.domain; /* * 客户的javaBean * @author ...

  10. python调用shell命令之三慷慨法

    preface: 忙于近期的任务,须要用到libsvm的一些命令.如在终端执行java svm_train train_file model_file. pythonsubset.py file tr ...