题目链接

动态区间第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. selenium网页没加载完成就停止加载并自动刷新

    判断一个网页10秒没加载完成就停止加载并自动刷新 driver=webdriver.Chome() driver.set_page_load_timeout(10) while True: try: ...

  2. OC自动释放池autoreleasepool介绍

    自动释放池的机制是:它使得应用在创建新对象时,系统能够有效地管理应用所使用的内存. @autoreleasepool { statements } 在创建新对象时,并且系统未启动ARC特性,那么在使用 ...

  3. Scalability, Availability & Stability Patterns

    https://blog.csdn.net/ajian005/article/details/6191814   一 自我有要求的读者应该提出问题:(研习:掌握层次:)能力级别:不会(了解)——领会( ...

  4. 012_Eclipse中使用 HDFS URL API 事例介绍

    本事例其实和使用hdfs FileSystem API差不多,FileSystem API也是通过解释成URL在hdfs上面执行的,性质相同,但是实际中用 的fFileSystem会多一点,源码如下: ...

  5. php分类树

    class Category{ public $sonName; public $parentName; public function __consturt($id,$parent_id){ $th ...

  6. request模块 一基础部分

    一.HTTP请求   通过requests发送网络请求,方法有get post put delete head options import requests r=requests.get(" ...

  7. JAVAWeb学习总结(一)

    一.基本概念 1.1.WEB开发的相关知识 WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. Internet上供外界访问的Web资源分为: 静态web资源( ...

  8. RDLC 微软报表 自定义函数

    报表的空白处点右键,报表属性,CODE,按下面的格式输入自定义函数: Shared Function ShowDate(value as DateTime) as string if value< ...

  9. STL中一些函数的应用

    1.nth_element():找到第几大的数.用法:nth_element(a,a+k,a+n),返回一个数组a中第k大的数,时间复杂度比较小,头文件#include <algorithm&g ...

  10. HBase-修改表结构

    HBase修改表结构 package com.hbase.HBaseAdmin; import java.io.IOException; import org.apache.hadoop.conf.C ...