1901: Zju2112 Dynamic Rankings

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 7218  Solved: 3000
[Submit][Status][Discuss]

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继续回答上面的问题。你需要编一个这样的程序,从输入文件中读入序列a,然后读入一系列的指令,包括询问指令和修改指令。对于每一个询问指令,你必须输出正确的回答。

第一行有两个正整数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。

Input

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

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

HINT

20%的数据中,m,n≤100; 40%的数据中,m,n≤1000; 100%的数据中,m,n≤10000。

Source

整体二分,先把初值插进去,每次修改分成两次,两种类型,一次是把上次的减去,一次是加上

#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
#define SIZE 100010
#define N 1000000000
#define lowbit(i) i&-i
struct data
{
char type;
int l,r,v,pos,x,u,last;
}op[SIZE];
vector<data> lp,rp; int n,q,tot;
int t[SIZE],ans[SIZE],pre[SIZE];
bool flag[SIZE]; void update(int pos,int delta)
{
for(int i=pos;i<=tot;i+=lowbit(i)) t[i]+=delta;
} int sum(int pos)
{
int ret=;
for(int i=pos;i>;i-=lowbit(i)) ret+=t[i];
return ret;
}
int abs(int x)
{
return x>?x:-x;
}
void solve(int l,int r,int lb,int ub)
{
if(l>r) return;
if(lb==ub)
{
for(int i=l;i<=r;i++)
if(op[i].type=='Q') ans[op[i].pos]=lb;
return;
}
int mb=(lb+ub)/;
lp.clear();
rp.clear();
for(int i=l;i<=r;i++)
{
if(op[i].type=='C')
{
if(op[i].v<=mb)
{
update(op[i].x,);
lp.push_back(op[i]);
} else rp.push_back(op[i]);
}
else if(op[i].type=='X')
{
if(op[i].v<=mb)
{
update(op[i].x,-);
lp.push_back(op[i]);
} else rp.push_back(op[i]);
}
else
{
int c=sum(op[i].r)-sum(op[i].l-);
if(c>=op[i].v)
{
lp.push_back(op[i]);
}
else
{
op[i].v-=c;
rp.push_back(op[i]);
}
}
}
for(int i=l;i<=r;i++)
{
if(op[i].type=='C'&&op[i].v<=mb)
{
update(op[i].x,-);
}
else if(op[i].type=='X'&&op[i].v<=mb)
{
update(op[i].x,);
}
}
for(int i=;i<lp.size();i++)
{
op[i+l]=lp[i];
}
int mid=l+lp.size();
for(int i=;i<rp.size();i++)
{
op[i+mid]=rp[i];
}
solve(l,mid-,lb,mb);
solve(mid,r,mb+,ub);
}
int main()
{
scanf("%d%d",&n,&q);
memset(ans,-,sizeof(ans));
for(int i=;i<=n;i++)
{
op[++tot].x=i;
scanf("%d",&op[tot].v);
pre[i]=op[tot].v;
op[tot].type='C';
}
for(int i=;i<=q;i++)
{
char s[]; scanf("%s",s);
if(s[]=='Q')
{
op[++tot].type=s[];
scanf("%d%d%d",&op[tot].l,&op[tot].r,&op[tot].v);
op[tot].pos=i;
}
else
{
tot+=;
op[tot].type=s[];
scanf("%d%d",&op[tot].x,&op[tot].v);
op[tot-].type='X';
op[tot-].x=op[tot].x;
op[tot-].v=pre[op[tot].x];
pre[op[tot].x]=op[tot].v;
}
}
solve(,tot,,N);
for(int i=;i<=tot;i++)
{
if(ans[i]!=-) printf("%d\n",ans[i]);
}
return ;
}

bzoj1901的更多相关文章

  1. 【树状数组套权值线段树】bzoj1901 Zju2112 Dynamic Rankings

    谁再管这玩意叫树状数组套主席树我跟谁急 明明就是树状数组的每个结点维护一棵动态开结点的权值线段树而已 好吧,其实只有一个指针,指向该结点的权值线段树的当前结点 每次查询之前,要让指针指向根结点 不同结 ...

  2. [BZOJ1901]Zju2112 Dynamic Rankings

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

  3. 【BZOJ1901】【Luogu2617】Dynamic Ranking(主席树,树状数组)

    [BZOJ1901][Luogu2617]Dynamic Ranking(主席树,树状数组) 题面 神TM BZOJ权限题 Luogu真良心 题解 如果不考虑修改 很容易的主席树区间第K大 考虑修改 ...

  4. BZOJ1901 Zju2112 Dynamic Rankings 主席树

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1901 题意概括 给你一段序列(n个数),让你支持一些操作(共m次), 有两种操作,一种是询问区间第 ...

  5. 少年,想学带修改主席树吗 | BZOJ1901 带修改区间第k小

    少年,想学带修改主席树吗 | BZOJ1901 带修改区间第k小 有一道题(BZOJ 1901)是这样的:n个数,m个询问,询问有两种:修改某个数/询问区间第k小. 不带修改的区间第k小用主席树很好写 ...

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

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

  7. bzoj1901&zoj2112&cogs257 Dynamic Rankings(动态排名系统)

    bzoj1901&zoj2112&cogs257 Dynamic Rankings(动态排名系统) cogs zoj bzoj-权限 题解 bzoj和zoj都是骗访问量的233,我没有 ...

  8. 【BZOJ1901】Dynamic Rankings(树套树,树状数组,主席树)

    题意:给定一个N个数的序列,要求维护一个数据结构支持以下两种操作: 1:将第X个数改成Y 2:查询第X到第Y个数里第K小的数是多少 n,m<=10000,a[i]<=10^9 思路:单点修 ...

  9. [bzoj1901][Zju2112]Dynamic Rankings_主席树

    Dynamic Rankings bzoj-1901 Zju-2112 题目大意:给定一个n个数的序列,m个操作,支持:单点修改:查询区间k小值. 注释:$1\le n,m\le 10^4$. 想法: ...

  10. BZOJ1901 ZOJ2112 线段树+treap (线段树套线段树)

    BZOJ1901: 线段树套线段树做法: (外层线段树 里层动态开节点的权值线段树) 有一个小小的trick 可以省掉二分变成nlog^2n的 就是把查询的区间都取出来- logn个一起走- 2016 ...

随机推荐

  1. Lenovo K29 笔记本经常没声音解决方案Hotkey[gevu18ww].exe

    下载 win8 快捷键驱动 安装即可解决 http://driverdl.lenovo.com.cn/lenovo/DriverFilesUploadFloder/36265/Hotkey[gevu1 ...

  2. C# - 网络编程 之 Socket

    命名空间 using System.Net; using System.Net.Socket; Socket类 初始化 public socket (AddressFamily addressFami ...

  3. FlashBuilder项目环境配置

    一 .安装Flash Builder 1.  修改host文件 1.1 找到host文件,复制到桌面修改. 在"C:\Windows\System32\drivers\etc"文件 ...

  4. PHP 过滤器(Filter)

    PHP 过滤器用于验证和过滤来自非安全来源的数据,比如用户的输入. 什么是 PHP 过滤器? PHP 过滤器用于验证和过滤来自非安全来源的数据. 验证和过滤用户输入或自定义数据是任何 Web 应用程序 ...

  5. 开始我的IT博客之旅

    这是一个好的开始,过程很漫长,但我却乐在其中. 在大学之际,这是我的又一个开始,随便写点啦. 想把每一次的过程记录下来 这样以后对自己 对别人都会有所帮助. 好啦 作为一名大三的学生党  加油吧!

  6. ThinkPHP 整合Bootstrap Ajax分页

    ThinkPHP Ajax分页代码 publicfunction index() { $where=array(); $name = I('name'); if(!empty($name)){ $wh ...

  7. vue2.0 非父子组件如何通信

    1 利用父组件传递 A组件传递到父组件,再由父组件传递到B组件 2 利用新的vue实例 var bus = new Vue() // 触发组件 A 中的事件 bus.$emit('id-selecte ...

  8. QQ互联登录以及非官方正版应用报100044错误

    QQ第三方登录的时候,显示非官方正版应用,报100044错误:坑1:我们在QQ互联注册成功后需要设置包名和签名,签名是通过官方提供的工具生成的.注意一点:这里的签名是需要由打包签名之后APK生成,我们 ...

  9. React Native知识10-ListView组件

    ListView - 一个核心组件,用于高效地显示一个可以垂直滚动的变化的数据列表.最基本的使用方式就是创建一个ListView.DataSource数据源,然后给它传递一个普通的数据数组,再使用数据 ...

  10. 跳转时候提示Attempt to present on while a presentation is in progress

    出现这种情况,例如:我在获取相册图片后,直接present到另一个页面,但是上一个页面可能还未dismiss,所以,要在获取相册图片的dismiss方法的complete的block里面写获取图片及跳 ...