题目链接

动态区间第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. BigDecimal类型、Long类型判断值是否相等,以及BigDecimal加减乘除

    //Long是需要比较精度的,所以要用longValueif(project.getFriendId().longValue() != friendId.longValue()) { return t ...

  2. active scaffold

    模板文件路径:/.rvm/gems/ruby-2.2.3/gems/active_scaffold-3.5.3/app/views/active_scaffold_overrides

  3. SQL 根据IF判断,SET字段值

    当INVOICE_STATUS值为1时,赋值为2,否者赋值为原来的值 UPDATE T_INVOICE SET DOWNLOAD_COUNT = DOWNLOAD_COUNT + 1, INVOICE ...

  4. g高分屏DataGrid里面checkbox不显示的解决办法

  5. hi3515 rtc驱动(ds1307/1339)驱动和示例

    将驱动放入/extdrv中编译 部分驱动如下: #include <linux/module.h> #include <linux/miscdevice.h>#include ...

  6. iOS_核心动画CALayer(一)

    目 录: 一.核心动画简介 二.图层与视图之间的关系 三.CALayer的使用说明 四.CALayer的隐式动画属性 五.在CALayer上绘图 六.总结     一.核心动画简介 Core Anim ...

  7. IDEA: 遇到问题Error during artifact deployment. See server log for details.详解

    IDEA 的配置确实有些烦人,完整的配置我之前发过,现在有个著名的报错: Error during artifact deployment. See server log for details. 这 ...

  8. MySQLdump导出sql脚本

    1.问题描述 通过图形化工具,在查询窗口用select语句按条件查询出所需结果,然后用“导出向导”把查询结果导成sql文件,但是导出来的sql语句不全,没有表名.字段名. 通过图形化工具,试了好多次都 ...

  9. hive学习8(小案例1练习)

    创建数据库 hive> create database feigu; hive> use feigu; 创建表 stg_job表 drop table if exists stg_job; ...

  10. Hadoop学习1(初识hadoop)

    Hadoop生态系统的特点 1)源代码开源 2)社区活跃,参与者多 3)涉及分布式存储和计算的各方面 4)已得到企业界的验证 Hadoop构成 1) 分布式文件系统HDFS(Hadoop Distri ...