题目链接

动态区间第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 (整体二分)的更多相关文章

  1. hdu 5412 CRB and Queries(整体二分)

    题意 动态区间第k大 (n<=100000,m<=100000) 题解 整体二分的应用. 与静态相比差别不是很大.(和CDQ还有点像)所以直接上代码. #include<iostre ...

  2. hdu 5412 CRB and Queries

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5412 CRB and Queries Description There are $N$ boys i ...

  3. Hdu CRB and Queries(整体二分)

    CRB and Queries Time Limit: 6000 MS Memory Limit: 131072 K Problem Description There are N boys in C ...

  4. HDU5412 CRB and Queries 整体二分

    传送门 刚觉得最近写代码比较顺畅没什么Bug,cdq分治真是我的一个噩梦.. 整体二分模板题,带修改的区间第k小. vjudge不知抽什么风,用不了,hdu忘了密码了一直在那里各种试,难受.. 写得比 ...

  5. HDU 5412——CRB and Queries——————【线段树套Treap(并没有AC)】

    CRB and Queries Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Other ...

  6. 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 ...

  7. 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 ...

  8. HDU 5412 CRB and Queries(区间第K大 树套树 按值建树)

    题目链接:http://acm.hdu.edu.cn/showproblem.php? pid=5412 Problem Description There are N boys in CodeLan ...

  9. 整体二分 HDU - 5808

    题目大意 有n个物品,排成一个序列,每个物品有一个di表示取到i要走的距离,vi表示i的价值. 给m组询问[l,r] ,c,sum,问由[l,r]的di<=c的物品能否凑出sum的价值(每个物品 ...

随机推荐

  1. 利用FFmpeg将RTSP转码成RTMP发布在RED5

    安装jdk,并设置环境  from:http://www.w3c.com.cn/%E5%88%A9%E7%94%A8ffmpeg%E5%B0%86-ipcamera-%E7%9A%84rtsp%E8% ...

  2. 正则表达式test match exec search

    (1)((2))(3)   $1  是第一个括号 $2  是第二个括号 $3  是第二个括号中的括号 $4  是第三个括号     http://www.jb51.net/article/28007. ...

  3. Ag-grid控件使用pine:left后,配合iview下拉框,会出现闪烁

    Ag-grid控件使用pinned:left后,配合iview下拉框,会出现闪烁 引起原因:下拉图标的反转动画 目前解决方案: 添加一个全局样式: 禁用动画,其他地方也是如此, 影响控件有:gz-tr ...

  4. 验证——正则<37>

    1,郵箱合法性驗證 /* * 郵箱合法性驗證 * @method matchTel * @papram{string} str,電子郵箱 * @return{boolean} * */ functio ...

  5. iOS_触摸事件与手势识别

    目  录: 一.触摸事件 1.1iOS的输入事件 1.2 触摸事件的处理 1.3 UITouch类中包含五个属性 1.4 UITouch类中包含两个成员函数 1.5响应者链 二.手势识别 2.1使用手 ...

  6. Android LCD(二):常用接口原理篇【转】

    本文转载自:http://blog.csdn.net/xubin341719/article/details/9125799 关键词:Android LCD TFT TTL(RGB)  LVDS  E ...

  7. freemarker入门实例与源码研究准备工作

    首先去freemarker官网下载源码jar包,本文是基于freemarker-2.3.21.tar.gz进行研究的.解压源码包,找到freemarker的源码部分导入eclipse工程中.需要注意的 ...

  8. struts2实现文件的上传和下载实例[转]

    实现原理 Struts 2是通过Commons FileUpload文件上传. Commons FileUpload通过将HTTP的数据保存到临时文件夹,然后Struts使用fileUpload拦截器 ...

  9. SQL Server technical bulletin - How to resolve a deadlock

    https://support.microsoft.com/en-us/help/832524/sql-server-technical-bulletin-how-to-resolve-a-deadl ...

  10. 【P3957】跳房子(单调队列+DP+二分)

    终于把这个题缸出来了,话说这题也不是想的那么难... 因为最小的最大,所以二分,因为由前面推出后面,所以DP,因为输入单调,朴素DP会T,所以单调队列.要注意的是,这个题数据很大,要开LL,然后DP数 ...