bzoj1901: Zju2112 Dynamic Rankings(BIT套主席树)
2024-10-18 07:55:33
带修改的题主席树不记录前缀,只记录单点,用BIT统计前缀。
对于BIT上每一个点建一棵主席树,修改和询问的时候用BIT跑,在主席树上做就行了。
3k4人AC的题#256...应该不算慢
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define ll long long
using namespace std;
const int maxn=,inf=1e9;
struct poi{int size,lt,rt;}tree[maxn*];
int n,m,tot,sz,cnt1,cnt2,N;
int t1[maxn],t2[maxn],a[maxn],b[maxn],x[maxn],y[maxn],z[maxn],root[maxn];
bool q[maxn];
char s[];
void read(int &k)
{
int f=;k=;char c=getchar();
while(c<''||c>'')c=='-'&&(f=-),c=getchar();
while(c<=''&&c>='')k=k*+c-'',c=getchar();
k*=f;
}
int lowbit(int x){return x&-x;}
void update(int &x,int l,int r,int cx,int delta)
{
tree[++sz]=tree[x];tree[sz].size+=delta;x=sz;
if(l==r)return;
int mid=(l+r)>>;
if(cx<=mid)update(tree[x].lt,l,mid,cx,delta);
else update(tree[x].rt,mid+,r,cx,delta);
}
int query(int l,int r,int k)
{
if(l==r)return l;
int mid=(l+r)>>,sum1=,sum2=;
for(int i=;i<=cnt1;i++)sum1+=tree[tree[t1[i]].lt].size;
for(int i=;i<=cnt2;i++)sum2+=tree[tree[t2[i]].lt].size;
if(sum2-sum1>=k)
{
for(int i=;i<=cnt1;i++)t1[i]=tree[t1[i]].lt;
for(int i=;i<=cnt2;i++)t2[i]=tree[t2[i]].lt;
return query(l,mid,k);
}
for(int i=;i<=cnt1;i++)t1[i]=tree[t1[i]].rt;
for(int i=;i<=cnt2;i++)t2[i]=tree[t2[i]].rt;
return query(mid+,r,k-(sum2-sum1));
}
int main()
{
read(n);read(m);
for(int i=;i<=n;i++)read(a[i]),b[++N]=a[i];
for(int i=;i<=m;i++)
{
scanf("%s",s+);
read(x[i]);read(y[i]);
if(s[]=='Q')read(z[i]),q[i]=;
else b[++N]=y[i];
}
sort(b+,b++N);N=unique(b+,b++N)-b-;
for(int i=;i<=n;i++)a[i]=lower_bound(b+,b++N,a[i])-b;
for(int i=;i<=n;i++)
for(int j=i;j<=n;j+=lowbit(j))
update(root[j],,N,a[i],);
for(int i=;i<=m;i++)
if(q[i])
{
cnt1=cnt2=;
for(int j=x[i]-;j;j-=lowbit(j))
t1[++cnt1]=root[j];
for(int j=y[i];j;j-=lowbit(j))
t2[++cnt2]=root[j];
printf("%d\n",b[query(,N,z[i])]);
}
else
{
for(int j=x[i];j<=n;j+=lowbit(j))
update(root[j],,N,a[x[i]],-);
a[x[i]]=lower_bound(b+,b++N,y[i])-b;;
for(int j=x[i];j<=n;j+=lowbit(j))
update(root[j],,N,a[x[i]],);
}
return ;
}
最新文章
- 前端工程师的PS默认工作区
- xampp配置host和httpd可以随意访问任何本机的地址
- HTML之学习笔记(二)颜色体系
- 初识golang
- jq插件开发总结
- UIScreen的scale属性
- 基于Vue全家桶制作的的高仿美团APP
- 第34节:Java当中的异常
- 【BZOJ2402】陶陶的难题II 分数规划+树链剖分+线段树+凸包
- Learning-Python【33】:并发编程之多进程
- PAT 乙级 1089 狼人杀 &;&; 1090 危险品装箱 (我的时间最短哦)
- CDH版本的hadoop下载
- C#哈希表(HashTable)和Dictionary比较
- 自动化CodeReview - ASP.NET Core依赖注入
- 2017.7.11 fuse工作原理
- MySQL-查缺补漏
- request.getParameter();的意思
- storm的代码实现
- Django的路由层(1)
- React监听窗口变化事件
热门文章
- 【SpringCloud】 第九篇: 服务链路追踪(Spring Cloud Sleuth)
- Unity编辑器 - DragAndDrop拖拽控件
- 213. String Compression【LintCode java】
- 【shell 练习4】编写Shell用户管理脚本(二)
- 官方文档 恢复备份指南三 Recovery Manager Architecture
- 物联网常见通信协议RFID、NFC、Bluetooth、ZigBee等梳理
- Python中__name__属性的妙用
- 软件工程 作业part1
- 寒假作业end
- 福大软工1816:beta版本冲刺前准备