传送门

刚觉得最近写代码比较顺畅没什么Bug,cdq分治真是我的一个噩梦。。

整体二分模板题,带修改的区间第k小。

vjudge不知抽什么风,用不了,hdu忘了密码了一直在那里各种试,难受。。

写得比较鬼畜。

整体二分,传了三个l,r分别是二分答案的 el ,er ,对当前答案可能有贡献的修改区间的 l , r ,答案在当前二分区间中的询问区间 ql, qr

每次对el, er 取个mid,然后修改区间是按时间排好序的,按时间扫过去,在修改值大于mid的地方+1(区间第k小等价于大于等于它的数有len-k+1个),同时把这些区间往右放,其余区间往作放。

然后对于询问区间查询区间内1的个数,就知道了区间中大于等于mid的数的个数,如果个数大于等于len-k+1就把询问区间往右放,否则减去查询的值往左放。

el==er时对所有的询问区间更新答案。

注意的时我的这种鬼畜写法往右放时二分区间是mid,r,往左是l,mid-1,所以对于偶数长度的区间强制mid靠右才ok。。

跑得还蛮快的。

反正我觉得树套树优秀多了,虽然跑得慢一点。

//Achen
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<vector>
#include<queue>
#include<ctime>
#include<cmath>
const int N=;
typedef long long LL;
using namespace std;
int n,m,cq,v[N],ans[N]; template<typename T> void read(T &x) {
char ch=getchar(); x=; T f=;
while(ch!='-'&&(ch<''||ch>'')) ch=getchar();
if(ch=='-') f=-,ch=getchar();
for(;ch>=''&&ch<='';ch=getchar()) x=x*+ch-''; x*=f;
} struct node {
int ti,pos,v,f;
node(){}
node(int ti,int pos,int v,int f):ti(ti),pos(pos),v(v),f(f){}
}cg[N],tp[N];
struct qs{
int id,ti,l,r,k;
qs(){}
qs(int id,int ti,int l,int r,int k):id(id),ti(ti),l(l),r(r),k(k){}
}q[N],t[N]; int sum[N];
void add(int x,int v) {
for(int i=x;i<=n;i+=(i&(-i)))
sum[i]+=v;
}
int qry(int x) {
int res=;
for(int i=x;i;i-=(i&(-i)))
res+=sum[i];
return res;
} void cdq(int el,int er,int l,int r,int ql,int qr) {
if(el>er||ql>qr) return;
if(el==er) {
for(int i=ql;i<=qr;i++) ans[q[i].id]=el;
return;
}
int mid=((el+er)>>); if((el+er)&) mid++;
int ll=l-,rr=r+,lx=ql-,rx=qr+,now=ql;
for(int i=l;i<=r+;i++) {
while(now<=qr&&(i==r+||q[now].ti<cg[i].ti)) {
int dd=qry(q[now].r)-qry(q[now].l-);
if(dd>=q[now].k) t[--rx]=q[now];
else { q[now].k-=dd; t[++lx]=q[now]; }
now++;
} if(i==r+) break;
if(cg[i].v>=mid) {
tp[--rr]=cg[i];
add(cg[i].pos,cg[i].f);
}
else tp[++ll]=cg[i];
}
int tr=rr,trr=rx;
for(int i=rr;i<=r;i++) add(tp[i].pos,-tp[i].f);
for(int i=l;i<=ll;i++) cg[i]=tp[i];
for(int i=r;i>ll;i--) cg[i]=tp[tr++];
for(int i=ql;i<=lx;i++) q[i]=t[i];
for(int i=qr;i>lx;i--) q[i]=t[trr++];
cdq(el,mid-,l,ll,ql,lx);
cdq(mid,er,rr,r,rx,qr);
} int main() {
while(scanf("%d",&n)==) {
int el=1e9,er=;
for(int i=;i<=n;i++) {
read(v[i]);
el=min(el,v[i]); er=max(er,v[i]);
cg[i]=node(i,i,v[i],);
}
read(m); cq=;
for(int i=;i<=m;i++) {
int o,x,y,k;
read(o); read(x); read(y);
if(o==) {
cg[++n]=node(n+i,x,v[x],-);
cg[++n]=node(n+i,x,y,); v[x]=y;
el=min(el,y); er=max(er,y);
}
else {
read(k);
q[++cq]=qs(cq,n+i,x,y,y-x+-k+);
}
}
cdq(el,er,,n,,cq);
for(int i=;i<=cq;i++) printf("%d\n",ans[i]);
}
return ;
}
/*
5
7 1 9 9 5
1
2 3 3 1
*/

HDU5412 CRB and Queries 整体二分的更多相关文章

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

    题目链接 动态区间第k小,但是这道题的话用主席树+树状数组套线段树的空间复杂度是O(nlog2n)会爆掉. 另一种替代的方法是用树状数组套平衡树,空间复杂度降到了O(nlogn),但我感觉平衡树是个挺 ...

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

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

  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

    1.题目大意:区间第k大,单点修改 2.随便搞搞就好了= =,树套树或主席树,我写的很丑 #include <cstdio> #include <cstdlib> #inclu ...

  5. 整体二分初探 两类区间第K大问题 poj2104 & hdu5412

    看到好多讲解都把整体二分和$CDQ$分治放到一起讲 不过自己目前还没学会$CDQ$分治 就单独谈谈整体二分好了 先推荐一下$XHR$的 <浅谈数据结构题的几个非经典解法> 整体二分在当中有 ...

  6. (困难) CF 484E Sign on Fence,整体二分+线段树

    Bizon the Champion has recently finished painting his wood fence. The fence consists of a sequence o ...

  7. 整体二分QAQ

    POJ 2104 K-th Number 时空隧道 题意: 给出一个序列,每次查询区间第k小 分析: 整体二分入门题? 代码: #include<algorithm> #include&l ...

  8. BZOJ 3110 [Zjoi2013]K大数查询 ——整体二分

    [题目分析] 整体二分显而易见. 自己YY了一下用树状数组区间修改,区间查询的操作. 又因为一个字母调了一下午. 貌似树状数组并不需要清空,可以用一个指针来维护,可以少一个log 懒得写了. [代码] ...

  9. [bzoj1901][zoj2112][Dynamic Rankings] (整体二分+树状数组 or 动态开点线段树 or 主席树)

    Dynamic Rankings Time Limit: 10 Seconds      Memory Limit: 32768 KB The Company Dynamic Rankings has ...

随机推荐

  1. spring-data-JPA repository自定义方法规则

    一.自定义方法的规则 Spring Data JPA框架在进行方法名解析时,会先把方法名多余的前缀截取掉,比如find,findBy,read,readBy,get,getBy,然后对剩下的部分进行解 ...

  2. MapReduce工作流程

  3. Android开发 LevelListDrawable详解

    前言 此篇博客正在施工中... 作者其实就是想挖个坑备忘一下... 十分抱歉, 可以参考https://www.jianshu.com/p/f9ec65241b6b

  4. 编译安装redis-3.2.9(latest stable version)

    What is the Redis? Redis is an open source (BSD licensed), in-memory data structure store, used as a ...

  5. [转]C#操作Excel初探

    近期一段时间正好在做winform导出Excel报表的问题,学习了一下C#操作Excel的一些方法(如:向Excel中插入图片:删除Excel指定sheet中的某行或某列,在Excel指定的单元格中画 ...

  6. Java驼峰和下划线互相转化

    直接上代码 : package com.utils; public class ChangeChar { public static final char UNDERLINE = '_'; publi ...

  7. js算法之寻路

    A*寻路算法 算法流程说明: 说明:起始节点记作S,目标节点记作E,对于任意节点P,从S到当前节点P的总移动消耗记作GP,节点P到目标E的曼哈顿距离记作HP,从节点P到相邻节点N的移动消耗记作DPN, ...

  8. C# FTP上传下载(支持断点续传)

    <pre class="csharp" name="code"><pre class="csharp" name=&quo ...

  9. laravel框架中使用QueryList插件采集数据

    laravel框架中使用queryList 采集数据 采集数据对我们来说真家常便饭,那么苦苦的写正则采集那么一点点东西,花费了自己大把的时间和精力而且没有一点技术含量,这个时候就是使用我们的好搭档Qu ...

  10. js中的继承和重载

      js中有三种继承方式:一.通过原型(prototype)实现继承 二.借用构造函数式继承,可分为通过call()方法实现继承和通过apply()方法实现继承 仅仅通过原型继承我们可以发现在实例化子 ...