HDU - 5412 CRB and Queries (整体二分)
动态区间第k小,但是这道题的话用主席树+树状数组套线段树的空间复杂度是O(nlog2n)会爆掉。
另一种替代的方法是用树状数组套平衡树,空间复杂度降到了O(nlogn),但我感觉平衡树是个挺恶心的东西,而且时间复杂度是O(nlog3n),比主席树还多了个logn。
最高效的方法是用一个叫整体二分的东西算法,它的基本思想是这样的:
假设当前所有查询的答案范围都在[l,r]之间,设mid=(l+r)/2,那么我们只处理所有修改后的值在[l,mid]中的修改操作,把不需要执行的修改操作全部扔到后半区间,那么对于每个询问操作都可以知道它的答案是在[l,mid]之间还是(mid+1,r]之间,这样就把所有的询问划分到了两个独立的区间,然后递归处理即可。本质上是将原序列转化成01序列,这样处理起来就方便多了。与CDQ分治较为类似,是个很神奇的算法。
空间复杂度O(n),时间复杂度O(nlog2n)
#include<bits/stdc++.h> using namespace std;
const int inf=0x3f3f3f3f;
const int N=1e5+;
struct QR {
int f,l,r,k,u,x,dx;
} qr[N<<]; int a[N],c[N],b[N<<],lq[N<<],rq[N<<],nq,tot,ans[N],n,m;
int lowbit(int x) {return x&-x;}
void add(int u,int x) {
for(; u<=n; u+=lowbit(u))c[u]+=x;
}
int query(int u) {
int ret=;
for(; u; u-=lowbit(u))ret+=c[u];
return ret;
} void solve(int l,int r,int L,int R) {
if(L>R)return;
if(l==r) {
for(int i=L; i<=R; ++i)if(qr[b[i]].f)ans[qr[b[i]].u]=l;
return;
}
int nl=,nr=,mid=(l+r)>>;
for(int i=L; i<=R; ++i) {
if(!qr[b[i]].f) {
if(qr[b[i]].x<=mid)add(qr[b[i]].u,qr[b[i]].dx),lq[nl++]=b[i];
else rq[nr++]=b[i];
} else {
int t=query(qr[b[i]].r)-query(qr[b[i]].l-);
if(qr[b[i]].k<=t)lq[nl++]=b[i];
else qr[b[i]].k-=t,rq[nr++]=b[i];
}
}
for(int i=; i<nl; ++i)if(!qr[lq[i]].f)add(qr[lq[i]].u,-qr[lq[i]].dx);
for(int i=; i<nl; ++i)b[L+i]=lq[i];
for(int i=; i<nr; ++i)b[L+nl+i]=rq[i];
solve(l,mid,L,L+nl-);
solve(mid+,r,L+nl,R);
} int main() {
while(scanf("%d",&n)==) {
nq=tot=;
memset(c,,sizeof c);
int maxn=;
for(int i=; i<=n; ++i) {
scanf("%d",&a[i]);
maxn=max(maxn,a[i]);
qr[nq++]=(QR) {,,,,i,a[i],};
}
scanf("%d",&m);
while(m--) {
int f;
scanf("%d",&f);
if(f==) {
int u,x;
scanf("%d%d",&u,&x);
qr[nq++]=(QR) {,,,,u,a[u],-};
qr[nq++]=(QR) {,,,,u,a[u]=x,};
maxn=max(maxn,a[u]);
} else {
int l,r,k;
scanf("%d%d%d",&l,&r,&k);
qr[nq++]=(QR) {,l,r,k,tot++,,};
}
}
for(int i=; i<nq; ++i)b[i]=i;
solve(,maxn,,nq-);
for(int i=; i<tot; ++i)printf("%d\n",ans[i]);
}
return ;
}
HDU - 5412 CRB and Queries (整体二分)的更多相关文章
- hdu 5412 CRB and Queries(整体二分)
题意 动态区间第k大 (n<=100000,m<=100000) 题解 整体二分的应用. 与静态相比差别不是很大.(和CDQ还有点像)所以直接上代码. #include<iostre ...
- hdu 5412 CRB and Queries
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5412 CRB and Queries Description There are $N$ boys i ...
- Hdu CRB and Queries(整体二分)
CRB and Queries Time Limit: 6000 MS Memory Limit: 131072 K Problem Description There are N boys in C ...
- HDU5412 CRB and Queries 整体二分
传送门 刚觉得最近写代码比较顺畅没什么Bug,cdq分治真是我的一个噩梦.. 整体二分模板题,带修改的区间第k小. vjudge不知抽什么风,用不了,hdu忘了密码了一直在那里各种试,难受.. 写得比 ...
- HDU 5412——CRB and Queries——————【线段树套Treap(并没有AC)】
CRB and Queries Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Other ...
- 2015 Multi-University Training Contest 10 hdu 5412 CRB and Queries
CRB and Queries Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Other ...
- HDU 5412 CRB and Queries 动态整体二分
Problem Description There are N boys in CodeLand.Boy i has his coding skill Ai.CRB wants to know who ...
- HDU 5412 CRB and Queries(区间第K大 树套树 按值建树)
题目链接:http://acm.hdu.edu.cn/showproblem.php? pid=5412 Problem Description There are N boys in CodeLan ...
- 整体二分 HDU - 5808
题目大意 有n个物品,排成一个序列,每个物品有一个di表示取到i要走的距离,vi表示i的价值. 给m组询问[l,r] ,c,sum,问由[l,r]的di<=c的物品能否凑出sum的价值(每个物品 ...
随机推荐
- 常见Web源码泄露总结
来自:http://www.hacksec.cn/Penetration-test/474.html 摘要 背景 本文主要是记录一下常见的源码泄漏问题,这些经常在web渗透测试以及CTF中出现. .h ...
- Shell编程之for和select循环
一.for和select循环 1.for循环语法 for 变量名 in 变量取值列表 do 指令... done C语言型for循环 for ((exp1; exp2; exp3)) do 指令... ...
- Windos Server 2008 NFS 服务安装使用
系统环境:Windos 2008 R2 x64位 安装服务:NFS 文件服务 我的电脑-->右击管理-->功能-->添加功能 选择网络文件系统服务工具 安装服务 添加角色 下一步 选 ...
- JAVA 使用qq邮箱发送邮件
引入一个架包: gradle( "com.sun.mail:javax.mail:1.5.6", ) 代码如下: private static final String QQ_EM ...
- rollingstyle in log4net
https://stackoverflow.com/questions/734963/log4net-rollingfileappender-with-composite-rolling-style- ...
- VCFtools
The C++ executable module examples This page provides usage examples for the executable module. Exte ...
- 针对oracle集群的连接配置
Java连接oracle数据库集群的配置:<DB NAME="WFS" DRIVER="oracle.jdbc.driver.OracleDriver" ...
- Apache Phoenix的Array类型
Apache Phoenix支持JDBC ARRAY类型,任何原生的数据类型就可以在ARRAY中使用.下面我介绍一下在创建的表中使用ARRAY类型. 先看一下创建表的SQL语句: CREATE TAB ...
- Elasticsearch Suggester 学习
suggester搜索就像百度搜索框中的提示类似. Elasticsearch 中提供类似的搜索功能. 答案就在Suggesters API. Suggesters基本的运作原理是将输入的文本分解为t ...
- Codeforces Round #390 (Div. 2) A B C D
这是一场比较难的div2 ... 比赛的时候只出了AB A很有意思 给出n个数 要求随意的把相邻的数合并成任意多数 最后没有为0的数 输出合并区间个数与区间 可以想到0可以合到任何数上并不改变该数的性 ...