社区讨论
我爱树状数组!
P3369【模板】普通平衡树参与者 3已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @lo9n33cb
- 此快照首次捕获于
- 2023/10/28 14:06 2 年前
- 此快照最后确认于
- 2023/10/28 14:06 2 年前
这题用树状数组水过了,代码如下:
CPP#include<bits/stdc++.h>
using namespace std;
namespace ljh{
#pragma GCC target("abm,avx,avx2,f16c,fma,mmx,popcnt,sse,sse2,sse3,sse4,ssse3,tune=native")
#define int long long
#define ull unsigned ll
#define lowbit(x) ((x)&(-x))
#define re register
// static char buf[1000000],*p1=buf,*p2=buf,obuf[1000000],*p3=obuf;
// #define getchar() p1==p2&&(p2=(p1=buf)+fread(buf,1,1000000,stdin),p1==p2)?EOF:*p1++
// #define putchar(x) (p3-obuf<1000000)?(*p3++=x):(fwrite(obuf,p3-obuf,1,stdout),p3=obuf,*p3++=x)
template<typename T>
inline void read(re T&x){
x=0;re int f=1;re char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9')x=(x<<3)+(x<<1)+(c^48),c=getchar();x*=f;
}template<typename T,typename...Args>
inline void read(re T&x,re Args&...args){read(x),read(args...);}
static char cc[40];
template<typename T>
inline void write(re T x){
if(!x)putchar('0');
re int len=0;
if(x<0)x=-x,putchar('-');
while(x)cc[len++]=x%10+48,x/=10;
while(len--)putchar(cc[len]);
}template<typename T,typename...Args>
inline void write(re T x,re Args...args){write(x),putchar(' '),write(args...);}
}using namespace ljh;
const int inf=2e7+5,MAXN=1e7+1;
int n,c[inf],ans;
int query(int x){
re int tot=0;
while(x)tot+=c[x],x-=lowbit(x);
return tot;
}
void add(int x,int y){
while(x<=(MAXN+1<<1))c[x]+=y,x+=lowbit(x);
}
signed main(){
// freopen("data.ans","w",stdout);
read(n);
while(n--){
int x,y;
read(x,y);
if(x==1){
add(y+MAXN,1);
}else if(x==2){
add(y+MAXN,-1);
}else if(x==3){
write(query(y+MAXN-1)+1),putchar('\n');
}else if(x==4){
int l=1,r=2e7+2,mid;
while(l<r){
mid=l+r>>1;
if(query(mid)>=y)r=mid;
else l=mid+1;
}write(l-MAXN),putchar('\n');
}else if(x==5){
y+=MAXN;
int l=1,r=y-1,mid;
while(l<r){
mid=l+r>>1;++mid;
if(query(y-1)-query(mid-1))l=mid;
else r=mid-1;
}write(l-MAXN),putchar('\n');
}else{
y+=MAXN;
int l=y+1,r=MAXN<<1,mid;
while(l<r){
mid=l+r>>1;
if(query(mid)-query(y))r=mid;
else l=mid+1;
}write(l-MAXN),putchar('\n');
}
}
// fwrite(obuf,p3-obuf,1,stdout);
return 0;
}
跑得还特快!!!

回复
共 3 条回复,欢迎继续交流。
正在加载回复...