整体二分(模板二)动态区间第K大
这才是更一般的二分写法--HDU5412
#define IOS ios_base::sync_with_stdio(0); cin.tie(0);
#include <cstdio>//sprintf islower isupper
#include <cstdlib>//malloc exit strcat itoa system("cls")
#include <iostream>//pair
#include <fstream>//freopen("C:\\Users\\13606\\Desktop\\Input.txt","r",stdin);
#include <bitset>
//#include <map>
//#include<unordered_map>
#include <vector>
#include <stack>
#include <set>
#include <string.h>//strstr substr strcat
#include <string>
#include <time.h>// srand(((unsigned)time(NULL))); Seed n=rand()%10 - 0~9;
#include <cmath>
#include <deque>
#include <queue>//priority_queue<int, vector<int>, greater<int> > q;//less
#include <vector>//emplace_back
//#include <math.h>
#include <cassert>
#include <iomanip>
//#include <windows.h>//reverse(a,a+len);// ~ ! ~ ! floor
#include <algorithm>//sort + unique : sz=unique(b+1,b+n+1)-(b+1);+nth_element(first, nth, last, compare)
using namespace std;//next_permutation(a+1,a+1+n);//prev_permutation
//******************
clock_t __START,__END;
double __TOTALTIME;
void _MS(){__START=clock();}
void _ME(){__END=clock();__TOTALTIME=(double)(__END-__START)/CLOCKS_PER_SEC;cout<<"Time: "<<__TOTALTIME<<" s"<<endl;}
//***********************
#define rint register int
#define fo(a,b,c) for(rint a=b;a<=c;++a)
#define fr(a,b,c) for(rint a=b;a>=c;--a)
#define mem(a,b) memset(a,b,sizeof(a))
#define pr printf
#define sc scanf
#define ls rt<<1
#define rs rt<<1|1
typedef pair<int,int> PII;
typedef vector<int> VI;
typedef long long ll;
const double E=2.718281828;
const double PI=acos(-1.0);//
const ll INF=(1LL<<);
const int inf=(<<);
const double ESP=1e-;
const int mod=(int)1e9+;
const int N=(int)4e6+; int ans[N],a[N];
int c[N],maxn;
int lowbit(int n){return n&(-n);}
void add(int i,int t)
{
while(i<=maxn)
{
c[i]+=t;
i+=lowbit(i);
}
}
int Sum(int i)
{
int sum=;
while(i)
{
sum+=c[i];
i-=lowbit(i);
}
return sum;
}
struct node
{
int l,r,k,id,currk,op;
}q[N],temp[N];
void Init()
{
for(int i=;i<=N-;++i)
c[i]=;
} void solve(int l,int r,int ql,int qr)
{
if(ql>qr)return;
int L=ql,R=qr,mid=l+r>>; if(l==r)
{
for(int i=ql;i<=qr;++i)
if(q[i].op==)
ans[q[i].id]=l;//答案
return;
}
for(int i=ql;i<=qr;++i)
{
if(q[i].op!=)temp[q[i].r<=mid?L++:R--]=q[i];//分位置 if(q[i].op==&&q[i].r<=mid)add(q[i].l,);//q.l才是要加的位置,q.r是值
else if(q[i].op==&&q[i].r<=mid)add(q[i].l,-);
else if(q[i].op==)
{
int sum=Sum(q[i].r)-Sum(q[i].l-);//二分是保证按时间顺序来的,直接计算就行
if(q[i].currk+sum>=q[i].k)temp[L++]=q[i];//分位置
else q[i].currk+=sum,temp[R--]=q[i];
}
}
for(int i=ql;i<=qr;++i)//清空-树状数组
{
if(q[i].op==&&q[i].r<=mid)add(q[i].l,-);
else if(q[i].op==&&q[i].r<=mid)add(q[i].l,);
}
//还原
for(int i=ql;i<=L-;++i)
q[i]=temp[i];
for(int i=qr,j=L;j<=qr;--i,++j)
q[j]=temp[i]; //递归下去
if(L>ql)solve(l,mid,ql,L-);
if(R<qr)solve(mid+,r,R+,qr);
} int main()
{
int n,m;
while(~sc("%d",&n))
{
// Init();
maxn=n;
for(int i=;i<=n;++i)
sc("%d",&q[i].r),q[i].l=i,a[i]=q[i].r,q[i].op=;
sc("%d",&m);
int ask=;
for(int i=;i<=m;++i)
{
int J;
sc("%d",&J);
if(J==)
{
int pos,x;
sc("%d%d",&pos,&x);
++n;
q[n].l=pos,q[n].r=a[pos],q[n].op=;//del
++n,a[pos]=x;
q[n].l=pos,q[n].r=a[pos],q[n].op=;//add
}
else
++n,sc("%d%d%d",&q[n].l,&q[n].r,&q[n].k),q[n].currk=,q[n].id=++ask,q[n].op=;//query
}
solve(,inf,,n);
for(int i=;i<=ask;++i)
pr("%d\n",ans[i]);
}
return ;
} /**************************************************************************************/
整体二分(模板二)动态区间第K大的更多相关文章
- 整体二分(模板) 求区间第k小
整体二分,将询问与初值一起放入一个结构体里,然后每次二分判断询问在哪边,树状数组维护,时间复杂度O((n+Q)lognlogMAX_a[i] 代码 #include<iostream> # ...
- ZOJ 1112 Dynamic Rankings【动态区间第K大,整体二分】
题目链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1112 题意: 求动态区间第K大. 分析: 把修改操作看成删除与增加 ...
- 整体二分初探 两类区间第K大问题 poj2104 & hdu5412
看到好多讲解都把整体二分和$CDQ$分治放到一起讲 不过自己目前还没学会$CDQ$分治 就单独谈谈整体二分好了 先推荐一下$XHR$的 <浅谈数据结构题的几个非经典解法> 整体二分在当中有 ...
- hdu5412(动态区间第k大)
CRB and Queries Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Other ...
- ZOJ 2112 Dynamic Rankings(动态区间第 k 大+块状链表)
题目大意 给定一个数列,编号从 1 到 n,现在有 m 个操作,操作分两类: 1. 修改数列中某个位置的数的值为 val 2. 询问 [L, R] 这个区间中第 k 大的是多少 n<=50,00 ...
- 动态区间第K大
整体二分. 主要需要注意的一点是,对于每个删除操作,若删除操作被算入贡献,则最开始的插入操作也一定会被算入,所以不必担心删除删错. #include<cstdio> #include< ...
- ZOJ2112--Dynamic Rankings (动态区间第k大)
Dynamic Rankings Time Limit: 10 Seconds Memory Limit: 32768 KB The Company Dynamic Rankings has ...
- 整体二分求动态区间第k大
比树状数组套主席树不知道高到哪里去了,solve(l,r,L,R)就是对于L,R的操作区间的答案都在l,r区间里,然后递归下去 复杂度O(nlognlogn),每个操作会执行logn次就是o(nlog ...
- Dynamic_Rankings(动态区间第k大)
ZOJ - 2112 \[ \ \] (那些说这道题是树状数组套主席树的人一定对主席树有误解!) 这里我们用树状数组套线段树来解决来写 首先 , 我们需要有n棵线段树(不是\(n^2\)空间,别慌) ...
随机推荐
- gitlab高可用模式
高可用模式 企业版 社区版 我们这里说一下成本比较低的主备模式,它主要依赖的是DRBD方式进行数据同步,需要2台ALL IN ONE的GitLab服务器,也就是通过上面安装方式把所有组件都安装在一起的 ...
- windows游戏编程X86 32位保护模式下的内存管理概述(一)
本系列文章由jadeshu编写,转载请注明出处.http://blog.csdn.net/jadeshu/article/details/22445945 作者:jadeshu 邮箱: jades ...
- 8月清北学堂培训 Day6
今天是杨思祺老师的讲授~ 图论 双连通分量 在无向图中,如果无论删去哪条边都不能使得 u 和 v 不联通, 则称 u 和 v 边双连通: 在无向图中,如果无论删去哪个点(非 u 和 v)都不能使得 u ...
- 1656:Combination
一本通1656:Combination 1656:Combination 时间限制: 1000 ms 内存限制: 524288 KB提交数: 89 通过数: 49 [题目描述] ...
- AcWing:242. 一个简单的整数问题(树状数组)
给定长度为N的数列A,然后输入M行操作指令. 第一类指令形如“C l r d”,表示把数列中第l~r个数都加d. 第二类指令形如“Q X”,表示询问数列中第x个数的值. 对于每个询问,输出一个整数表示 ...
- Atcoder ABC 139C
Atcoder ABC 139C 题意: 有 $ n $ 个正方形,选择一个起始位置,使得从这个位置向右的小于等于这个正方形的高度的数量最多. 解法: 简单递推. CODE: #include< ...
- 【java中的final关键字】
转自:https://www.cnblogs.com/xiaoxi/p/6392154.html 一.final关键字的基本用法 在Java中,final关键字可以用来修饰类.方法和变量(包括成员变量 ...
- Logback 日志策略配置
[参考文章]:官方文档:Logback configuration [参考文章]:logback的使用和logback.xml详解 [参考文章]:Logback源码赏析-日志按时间滚动(切割) 1. ...
- pwn学习日记Day22 《程序员的自我修养》读书笔记
知识杂项 软连接 命令: ln -s 原文件 目标文件 特征: 1.相当于windows的快捷方式 2.只是一个符号连接,所以软连接文件大小都很小 3.当运行软连接的时候,会根据连接指向找到真正的文件 ...
- JSON字符串控制台格式化输出 java
1.正常情况下返回的json数据格式如下: {"header":{"transSn":"e33128bb7622462ebfb2cbfcc46baa1 ...