整体二分--BZOJ1901: Zju2112 Dynamic Rankings
2024-09-30 04:26:47
n<=10000个数有m<=10000个操作,1、询问一个区间的第k小的数;2、单点修改。
带修主席树。
整体二分。
整体二分的必要条件:
#include<string.h>
#include<stdlib.h>
#include<stdio.h>
//#include<assert.h>
#include<algorithm>
//#include<iostream>
using namespace std; int n,m;
#define maxn 30011
const int inf=0x3f3f3f3f;
struct Ope
{
int x,y,z,id,type;
//type=1: 询问区间[x,y]第z大,询问编号id
//type=0:把位置x的数修改为y,增加:z=1,删除:z=-1
}q[maxn],al[maxn],ar[maxn];int len;
int ans[maxn]; struct BIT
{
int a[maxn];
void add(int x,int v) {for (;x<=n;x+=x&-x) a[x]+=v;}
int query(int x) {int ans=; for (;x;x-=x&-x) ans+=a[x]; return ans;}
}t; void solve(int L,int R,int ql,int qr)
{
if (L>R || ql>qr) return;
if (L==R)
{
for (int i=ql;i<=qr;i++) if (q[i].type) ans[q[i].id]=L;
return;
}
int mid=(L+R)>>,lql=,lqr=;
for (int i=ql;i<=qr;i++)
{
if (q[i].type)
{
int tmp=t.query(q[i].y)-t.query(q[i].x-);
if (tmp>=q[i].z) al[++lql]=q[i];
else
{
q[i].z-=tmp;
ar[++lqr]=q[i];
}
}
else
{
if (q[i].y<=mid)
{
t.add(q[i].x,q[i].z);
al[++lql]=q[i];
}
else ar[++lqr]=q[i];
}
}
for (int i=;i<=lql;i++) if (al[i].type==) t.add(al[i].x,-al[i].z);
for (int i=,j=ql;i<=lql;i++,j++) q[j]=al[i];
for (int i=,j=ql+lql;i<=lqr;i++,j++) q[j]=ar[i];
solve(L,mid,ql,ql+lql-);
solve(mid+,R,ql+lql,qr);
} int a[maxn];
int main()
{
scanf("%d%d",&n,&m);
for (int i=;i<=n;i++) scanf("%d",&q[i].y),a[i]=q[i].y,q[i].x=i,q[i].z=,q[i].type=;
char s[];
int cntq=;
for (int i=,j=n+;i<=m;i++,j++)
{
scanf("%s",s);
if (s[]=='Q') scanf("%d%d%d",&q[j].x,&q[j].y,&q[j].z),q[j].id=++cntq,q[j].type=;
else scanf("%d%d",&q[j].x,&q[j].y),q[j].z=,q[j].type=,
q[j+]=(Ope){q[j].x,a[q[j].x],-,,},a[q[j].x]=q[j].y,j++;
if (i==m) len=j;
}
solve(,inf,,len);
for (int i=;i<=cntq;i++) printf("%d\n",ans[i]);
return ;
}
最新文章
- PostgreSQL介绍以及如何开发框架中使用PostgreSQL数据库
- dom4j使用总结
- Java和C#下的参数验证
- 【UE4游戏开发】安装UE4时报SU-PQR1603错误的解决方法
- 【Android端APP 安装包检查】安装包检查具体内容及实现方法
- CSS3实现32种基本图形
- [linux] Upgrading glibc for the GHOST Vulnerability
- [ZZ] GTX 280 GPU architecture
- 夺命雷公狗---DEDECMS----27dedecms电影的下载地址的完成
- 【转】java_web开发入门
- IDTHook 深入学习
- 【原创】一起学C++ 之指针的--/++ ---------C++ primer plus(第6版)
- @Entity设置实体lazy = false
- 高效算法——E - 贪心-- 区间覆盖
- file_get_content、fsockopen和curl之间的优缺点
- 图解函数重载以及arguments
- SmartSql For Asp.Net Core 最佳实践
- EBS WEBADI导入日记账 客户化账户组合规则校验
- ActiveMQ笔记:管理和监控
- DPDK helloworld 源码阅读