hdu 5412 CRB and Queries(整体二分)
2024-08-31 15:24:25
题意
动态区间第k大
(n<=100000,m<=100000)
题解
整体二分的应用。
与静态相比差别不是很大。(和CDQ还有点像)所以直接上代码。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=;
struct query{
int x,y,type,k,w;
}q[N],c1[N],c2[N];
int n,m,ans[N],tr[N],mx,tot,cnt,a[N];
int lowbit(int x){
return x&-x;
}
void add(int x,int w){
for(int i=x;i<=n;i+=lowbit(i)){
tr[i]+=w;
}
}
int getsum(int x){
int ans=;
for(int i=x;i;i-=lowbit(i)){
ans+=tr[i];
}
return ans;
}
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(q[i].type==)ans[q[i].w]=L;
}
return ;
}
int mid=(L+R)>>;
int lnow=;int rnow=;
for(int i=l;i<=r;i++){
if(q[i].type==){
int tmp=getsum(q[i].y)-getsum(q[i].x-);
if(tmp>=q[i].k){
c1[++lnow]=q[i];
}
else{
q[i].k-=tmp;
c2[++rnow]=q[i];
}
}
else{
if(q[i].type==&&q[i].y<=mid)add(q[i].x,);
if(q[i].type==&&q[i].y<=mid)add(q[i].x,-);
if(q[i].y<=mid)c1[++lnow]=q[i];
else c2[++rnow]=q[i];
}
}
for(int i=l;i<=r;i++){
if(q[i].type==&&q[i].y<=mid)add(q[i].x,-);
if(q[i].type==&&q[i].y<=mid)add(q[i].x,);
}
for(int i=;i<=lnow;i++){
q[l+i-]=c1[i];
}
for(int i=;i<=rnow;i++){
q[l+lnow+i-]=c2[i];
}
solve(l,l+lnow-,L,mid);
solve(l+lnow,r,mid+,R);
}
int main(){
while(~scanf("%d",&n)){
mx=;cnt=;tot=;
for(int i=;i<=n;i++){
scanf("%d",&a[i]);
q[++cnt].type=;q[cnt].x=i;q[cnt].y=a[i];
mx=max(mx,a[i]);
}
scanf("%d",&m);
for(int i=;i<=m;i++){
int k;
scanf("%d",&k);
if(k==){
int x,y;
scanf("%d%d",&x,&y);
q[++cnt].type=;q[cnt].x=x;q[cnt].y=a[x];
q[++cnt].type=;q[cnt].x=x;q[cnt].y=y;
a[x]=y;
mx=max(mx,y);
}
else{
int x,y,k;
scanf("%d%d%d",&x,&y,&k);
q[++cnt].type=;q[cnt].x=x;q[cnt].y=y;q[cnt].k=k;
q[cnt].w=++tot;
}
}
solve(,cnt,,mx);
for(int i=;i<=tot;i++){
printf("%d\n",ans[i]);
}
}
return ;
}
最新文章
- 解决一则enq: TX – row lock contention的性能故障
- JavaScriptSerializer使用条件
- Android学习---SQLite数据库的增删改查和事务(transaction)调用
- Linux服务器管理: RPM包
- 一份高级Java招聘要求
- UIScrollView和UIPageController
- C语言常用的库文件(头文件、函数库)
- Apache 隐藏入口文件 index.php
- solr研磨之facet
- nsqlookupd.go
- RAM和ROM
- Mybatis的SqlSession运行原理
- 深度学习python的配置(Windows)
- [转]bootstrapValidator.js 做表单验证
- python +百度语音识别+图灵对话
- 5个适用于初学者的有用数据分析表达式(DAX)函数
- iOS指令集
- C# WPF xml序列化 反序列化
- 【BZOJ1489】[HNOI2009]双递增序列(动态规划)
- 【MyBatis】MyBatis之分页
热门文章
- 新手村,学会做人选数 https://www.luogu.org/problemnew/show/P1036
- 页面的URL分析----window.location.href
- (转载)详解7.0带来的新工具类:DiffUtil
- shell-3.bash的基本功能: history tab alias 快捷键
- 路飞学城Python-Day11
- BZOJ 4472 [Jsoi2015]salesman(树形DP)
- Linux 添加挂载硬盘(包含挂载大于2T以上硬盘)
- python __future__ 的几种特性
- spring 、Mybatis配置sql server数据库
- 可替代google的各种搜索引擎