传送门

刚觉得最近写代码比较顺畅没什么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. 拦截器和自定义注解@interface

    1 .拦截器(Interceptor): 用于在某个方法被访问之前进行拦截,然后在Handler执行之前或之后加入某些操作,其实就是AOP的一种实现策略. 拦截用户的请求并进行相应的处理,比如:判断用 ...

  2. 廖雪峰Java13网络编程-1Socket编程-5UDP编程

    1. UDP编程: 不需要建立连接 可以直接发送和接收数据 1.1 客户端 DatagramSocket sock = new DatagramSocket(){} sock.connect(addr ...

  3. 杂项-公司:SAMSUNG

    ylbtech-杂项-公司:SAMSUNG 三星集团是韩国最大的跨国企业集团,同时也是上市企业全球500强,三星集团包括众多的国际下属企业,旗下子公司有:三星电子.三星物产.三星航空.三星人寿保险等, ...

  4. 04.如何升级扩展以支持Visual Studio 2019

    更新.vsixmanifest 我们需要对.vsixmanifest文件进行一些更新.首先,我们必须更新支持的VS版本范围 <InstallationTarget> 这是一个版本,支持Vi ...

  5. 虚拟机vm安装黑群晖6.2

    操作系统选择

  6. python多线程建立代理ip池

    之前有写过用单线程建立代理ip池,但是大家很快就会发现,用单线程来一个个测试代理ip实在是太慢了,跑一次要很久才能结束,完全无法忍受.所以这篇文章就是换用多线程来建立ip池,会比用单线程快很多.之所以 ...

  7. HBase Ganglia

  8. nfs 原理详解

    一.NFS介绍 1)什么是NFS 它的主要功能是通过网络让不同的机器系统之间可以彼此共享文件和目录.NFS服务器可以允许NFS客户端将远端NFS服务器端的共享目录挂载到本地的NFS客户端中.在本地的N ...

  9. linux平台进行c语言源码安装

    安装c源程序的步骤: 1. ./configure --prefix 执行编译检测 指定安装路径 2. make 编译 3. sudo make install 编译后安装 前两步可以合成一步(mak ...

  10. BZOJ 1933 [Shoi2007]Bookcase 书柜的尺寸

    神奇的dp优化. 考虑6维状态的dp,分别表示三行高和宽,显然MLE&&TLE. 把高排个序,从大到小往架上放,那么若不是重开一行便对高度没有影响. 然后求出宽度的sum,dp[i][ ...