HDU5412 CRB and Queries 整体二分
刚觉得最近写代码比较顺畅没什么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 整体二分的更多相关文章
- HDU - 5412 CRB and Queries (整体二分)
题目链接 动态区间第k小,但是这道题的话用主席树+树状数组套线段树的空间复杂度是O(nlog2n)会爆掉. 另一种替代的方法是用树状数组套平衡树,空间复杂度降到了O(nlogn),但我感觉平衡树是个挺 ...
- hdu 5412 CRB and Queries(整体二分)
题意 动态区间第k大 (n<=100000,m<=100000) 题解 整体二分的应用. 与静态相比差别不是很大.(和CDQ还有点像)所以直接上代码. #include<iostre ...
- Hdu CRB and Queries(整体二分)
CRB and Queries Time Limit: 6000 MS Memory Limit: 131072 K Problem Description There are N boys in C ...
- hdu5412——CRB and Queries
1.题目大意:区间第k大,单点修改 2.随便搞搞就好了= =,树套树或主席树,我写的很丑 #include <cstdio> #include <cstdlib> #inclu ...
- 整体二分初探 两类区间第K大问题 poj2104 & hdu5412
看到好多讲解都把整体二分和$CDQ$分治放到一起讲 不过自己目前还没学会$CDQ$分治 就单独谈谈整体二分好了 先推荐一下$XHR$的 <浅谈数据结构题的几个非经典解法> 整体二分在当中有 ...
- (困难) CF 484E Sign on Fence,整体二分+线段树
Bizon the Champion has recently finished painting his wood fence. The fence consists of a sequence o ...
- 整体二分QAQ
POJ 2104 K-th Number 时空隧道 题意: 给出一个序列,每次查询区间第k小 分析: 整体二分入门题? 代码: #include<algorithm> #include&l ...
- BZOJ 3110 [Zjoi2013]K大数查询 ——整体二分
[题目分析] 整体二分显而易见. 自己YY了一下用树状数组区间修改,区间查询的操作. 又因为一个字母调了一下午. 貌似树状数组并不需要清空,可以用一个指针来维护,可以少一个log 懒得写了. [代码] ...
- [bzoj1901][zoj2112][Dynamic Rankings] (整体二分+树状数组 or 动态开点线段树 or 主席树)
Dynamic Rankings Time Limit: 10 Seconds Memory Limit: 32768 KB The Company Dynamic Rankings has ...
随机推荐
- spark 应用场景2-身高统计
原文引自:http://blog.csdn.net/fengzhimohan/article/details/78564610 a. 案例描述 本案例假设我们需要对某个省的人口 (10万) 性别还有身 ...
- Ubuntu环境下java.lang.SecurityException: Invalid signature file digest for Manifest main attributes
一.问题描述 Ubuntu环境中,将maven项目打包成jar包传到服务器中后运行以下指令: $ java -cp my.jar com.myproject.Main 遇到报错: java.lang. ...
- sql中on的连接条件与where的区别
left join [表名] on [条件] where [条件] --on表示连接条件 --where表示对结果的过滤条件 两者不尽相同,使用时需注意 例如: select * from tabl ...
- 【BZOJ3223】【luoguP3391】文艺平衡树
description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 ...
- Mysql引擎MyISAM和InnoDB的区别
InnoDB的数据存储在表空间中,表空间是由InnoDB管理的一个黑盒子,由一系列的数据文件组成.InnoDB可以将每个表的数据和索引存放在单独的文件中. InnoDB采用MVCC来支持高并发,并且实 ...
- Thinkphp5 RCE总结
thinkphp5最出名的就是rce,我先总结rce,rce有两个大版本的分别 ThinkPHP 5.0-5.0.24 ThinkPHP 5.1.0-5.1.30 因为漏洞触发点和版本的不同,导致pa ...
- .Net StackFrame
StackFrame指的是一个.net运行的时候堆栈上的一个帧(Frame),每次进入一个方法的时候就会有一个新的方法帧压入线程执行堆栈,可以通过StackFrame获取相关的信息,比如当前代码所在文 ...
- Spring MVC(七)--传递JSON参数
有时候参数的传递还需要更多的参数,比如一个获取用户信息的请求中既有用户ID等基本参数,还要求对查询结果进行分页,针对这种场景,一般都会将分页参数封装成一个对象,然后将它和基本参数一起传给控制器,为了控 ...
- typeof 、Object.prototype.toString和 instanceof
数据类型 js 基本类型包括:Undefined symbol null string boolean number js 引用类型包括:object array Date RegExp typeo ...
- 2019-8-26-当-ASP.NET-Core-链接找不到时可能的原因
title author date CreateTime categories 当 ASP.NET Core 链接找不到时可能的原因 lindexi 2019-08-26 18:52:28 +0800 ...