社区讨论

我爱树状数组!

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 条回复,欢迎继续交流。

正在加载回复...