整体二分--BZOJ1901: Zju2112 Dynamic Rankings
n<=10000个数有m<=10000个操作,1、询问一个区间的第k小的数;2、单点修改。
带修主席树。
整体二分。
整体二分的必要条件:
#include<string.h>
#include<stdlib.h>
#include<stdio.h>
//#include<assert.h>
#include<algorithm>
//#include<iostream>
using namespace std; int n,m;
#define maxn 30011
const int inf=0x3f3f3f3f;
struct Ope
{
int x,y,z,id,type;
//type=1: 询问区间[x,y]第z大,询问编号id
//type=0:把位置x的数修改为y,增加:z=1,删除:z=-1
}q[maxn],al[maxn],ar[maxn];int len;
int ans[maxn]; struct BIT
{
int a[maxn];
void add(int x,int v) {for (;x<=n;x+=x&-x) a[x]+=v;}
int query(int x) {int ans=; for (;x;x-=x&-x) ans+=a[x]; return ans;}
}t; void solve(int L,int R,int ql,int qr)
{
if (L>R || ql>qr) return;
if (L==R)
{
for (int i=ql;i<=qr;i++) if (q[i].type) ans[q[i].id]=L;
return;
}
int mid=(L+R)>>,lql=,lqr=;
for (int i=ql;i<=qr;i++)
{
if (q[i].type)
{
int tmp=t.query(q[i].y)-t.query(q[i].x-);
if (tmp>=q[i].z) al[++lql]=q[i];
else
{
q[i].z-=tmp;
ar[++lqr]=q[i];
}
}
else
{
if (q[i].y<=mid)
{
t.add(q[i].x,q[i].z);
al[++lql]=q[i];
}
else ar[++lqr]=q[i];
}
}
for (int i=;i<=lql;i++) if (al[i].type==) t.add(al[i].x,-al[i].z);
for (int i=,j=ql;i<=lql;i++,j++) q[j]=al[i];
for (int i=,j=ql+lql;i<=lqr;i++,j++) q[j]=ar[i];
solve(L,mid,ql,ql+lql-);
solve(mid+,R,ql+lql,qr);
} int a[maxn];
int main()
{
scanf("%d%d",&n,&m);
for (int i=;i<=n;i++) scanf("%d",&q[i].y),a[i]=q[i].y,q[i].x=i,q[i].z=,q[i].type=;
char s[];
int cntq=;
for (int i=,j=n+;i<=m;i++,j++)
{
scanf("%s",s);
if (s[]=='Q') scanf("%d%d%d",&q[j].x,&q[j].y,&q[j].z),q[j].id=++cntq,q[j].type=;
else scanf("%d%d",&q[j].x,&q[j].y),q[j].z=,q[j].type=,
q[j+]=(Ope){q[j].x,a[q[j].x],-,,},a[q[j].x]=q[j].y,j++;
if (i==m) len=j;
}
solve(,inf,,len);
for (int i=;i<=cntq;i++) printf("%d\n",ans[i]);
return ;
}
整体二分--BZOJ1901: Zju2112 Dynamic Rankings的更多相关文章
- [BZOJ1901]Zju2112 Dynamic Rankings
[BZOJ1901]Zju2112 Dynamic Rankings 试题描述 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i ...
- BZOJ-1901 Zju2112 Dynamic Rankings 函数式线段树 套 树状数组+离线处理
1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec Memory Limit: 128 MB Submit: 6058 Solved: 2521 [Su ...
- BZOJ1901: Zju2112 Dynamic Rankings(整体二分 树状数组)
Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 9094 Solved: 3808[Submit][Status][Discuss] Descript ...
- [luogu2617][bzoj1901][Zju2112]Dynamic Rankings【树套树+树状数组+主席树】
题目网址 [传送门] 题目大意 请你设计一个数据结构,支持单点修改,区间查询排名k. 感想(以下省略脏话inf个字) 真的强力吹爆洛谷数据,一般的树套树还给我T了一般的点,加强的待修主席树还给我卡了几 ...
- 【树状数组套权值线段树】bzoj1901 Zju2112 Dynamic Rankings
谁再管这玩意叫树状数组套主席树我跟谁急 明明就是树状数组的每个结点维护一棵动态开结点的权值线段树而已 好吧,其实只有一个指针,指向该结点的权值线段树的当前结点 每次查询之前,要让指针指向根结点 不同结 ...
- BZOJ1901——Zju2112 Dynamic Rankings
1.题目大意:区间第k小,有单点修改 2.分析:这个是树状数组套线段树,也是主席树....为什么主席树这么多QAQ 就是树套树的那种插入什么的,注意啊,一定要动态开内存..不然会爆.. 然后算答案有两 ...
- BZOJ1901 Zju2112 Dynamic Rankings 主席树
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1901 题意概括 给你一段序列(n个数),让你支持一些操作(共m次), 有两种操作,一种是询问区间第 ...
- 【分块】bzoj1901 Zju2112 Dynamic Rankings
区间k大,分块大法好,每个区间内存储一个有序表. 二分答案,统计在区间内小于二分到的答案的值的个数,在每个整块内二分.零散的暴力即可. 还是说∵有二分操作,∴每个块的大小定为sqrt(n*log2(n ...
- bzoj1901: Zju2112 Dynamic Rankings(BIT套主席树)
带修改的题主席树不记录前缀,只记录单点,用BIT统计前缀. 对于BIT上每一个点建一棵主席树,修改和询问的时候用BIT跑,在主席树上做就行了. 3k4人AC的题#256...应该不算慢 #incl ...
随机推荐
- Spirng MVC +Velocity 表单绑定命令对象
通常,表单中的数据在提交之后可以通过Spring MVC的@RequestParam注解在控制器函数的参数列表中中提取出来,但是一旦表单数据过多的话,参数列表将会变得非常长,最好的解决方案是将表单中的 ...
- Xamarin.Forms跨平台开发入门-第二部分:深入解析
英文原文: https://developer.xamarin.com/guides/xamarin-forms/getting-started/hello-xamarin-forms/deepdiv ...
- Apache Tomcat 之路(二 部署web 应用程序)
1.创建一个webapplication,不论是解压的应用程序包还是war包,在tomcat 上都能部署,这里提供一个简单的web项目:git地址:https://github.com/coderxi ...
- iOS定位--CoreLocation框架
CoreLocation框架的使用 // 首先导入头文件 #import <CoreLocation/CoreLocation.h> CoreLocation框架中所有数据类型的前缀都是C ...
- RegisterClientScriptBlock和RegisterStartupScript的区别
RegisterClientScriptBlock在 Page 对象的 元素的开始标记后立即发出客户端脚本,RegisterStartupScript则是在Page 对象的 元素的结束标记之前发出该脚 ...
- 迅为iTOP-4418/6818开发板MiniLinux下的GPS使用手册
平台:iTOP-4418/6818开发板 系统:MiniLinux 在 Mini Linux 系统环境下 iTOP-4418 和 6818 的 GPS 实验调试步骤.给用户提供了“iTOP-4418- ...
- create_module - 生成一条可加载模块记录
总览 #include <linux/module.h> caddr_t create_module(const char *name, size_t size); 描述 create_m ...
- C#中练级orcle数据查询
直接贴代码哈哈哈, public DataTable getInfo(int flag) { OracleConnection conn = null; DataSet ds = new DataSe ...
- jQuery中Ajax事件beforesend及各参数含义1
jQuery中Ajax事件beforesend及各参数含义 转自:http://blog.sina.com.cn/s/blog_609f9fdd0100wprz.html Ajax会触发很多事件. 有 ...
- redis简介以及安装
redis作为开源的高性能的键值对数据库,本身是单线程的,性能虽然没有memcache高,但是也是性能跟memcache相差无几的,memcache是多线程的,但是redis本身功能更加强大,学习一下 ...