整体二分--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 ...
随机推荐
- 自定义Image HtmlHelper
public static void Image(this HtmlHelper helper, string src, string alt = null, object htmlAttribute ...
- 阿里云服务器 Access to the path '....' is denied.解决方法
昨天公司项目迁移服务器,从自己服务器迁移到阿里云服务器,部署完成后发现有一个页面要读取磁盘上的静态文件就报错了... 如图: 解决办法: 在 Web.Config 的 <System.Web&g ...
- 免费大数据搜索引擎 xunsearch 实践
以前在IBM做后端开发时,也接触过关于缓存技术,当时给了n多文档来学习,后面由于其他紧急的项目,一直没有着手去仔细研究这个技术,即时后来做Commerce的时候,后台用了n多缓存技术,需要build ...
- nginx负载均衡浅析
熟悉Nginx的小伙伴都知道,Nginx是一个非常好的负载均衡器.除了用的非常普遍的Http负载均衡,Nginx还可以实现Email,FastCGI的负载均衡,甚至可以支持基于Tcp/UDP协议的各种 ...
- 在JAVA中封装JSONUtils工具类及使用 (转)
import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util. ...
- github——团队合作
- swift 与 NSObject
以NSObject为基类,只是为了提供Objective-C API的使用入口: 经由@object修改的对象,是这些api的参量. NSObject是swift与oc特有机制沟通的桥梁. Subcl ...
- emil 的使用
摘抄自别人 RFC882文档规定了如何编写一封简单的邮件(纯文本邮件),一封简单的邮件包含邮件头和邮件体两个部分,邮件头和邮件体之间使用空行分隔. 邮件头包含的内容有: from字段 --用于指明发 ...
- web.xml的简单解释以及Hello1中web.xml的简单分析
一.web.xml的加载过程 ①当我们启动一个WEB项目容器时,容器包括(JBoss,Tomcat等).首先会去读取web.xml配置文件里的配置,当这一步骤没有出错并且完成之后,项目才能正常的被启动 ...
- 【转】c语言中的定义和声明
1. 变量的定义.声明 变量的声明有两种情况: 一种是需要建立存储空间的.例如:int a.在声明的时候就已经建立了存储空间.这种声明是"定义性声明(defining declaratio ...