全都差1,求调精度
查看原帖
全都差1,求调精度
668765
atom_yan楼主2023/10/14 21:28
#include <bits/stdc++.h>
using namespace std;
template <typename T>inline void read(T& t){
	t=0; register char ch=getchar(); register int fflag=1;
	while(!('0'<=ch&&ch<='9')){if(ch=='-') fflag=-1;ch=getchar();}
	while(('0'<=ch&&ch<='9')){t=t*10+ch-'0'; ch=getchar();} t*=fflag;
}
template <typename T,typename... Args> inline void read(T& t, Args&... args){read(t);read(args...);}
const int N=1e6+1000;
int n,ans,m;
struct node{
	int t,type,flag;
	node(int t,int type,int flag):t(t),type(type),flag(flag){ }
	node(){t=type=flag=0;}
}cnt[N];
struct Array_Tree{
	int tr[N<<1];
	void update(int p,const int k){
		for(;p<(N<<1);p+=(p&-p))
			tr[p]+=k;
	}
	int query(int l,int r){
		int res=0;
		for(;r;r-=(r&-r))
			res+=tr[r];
		for(l--;l;l-=(l&-l))
			res-=tr[l];
		return res;
	}
}sma,lar;
int main(){
//	freopen("P5482_1.in","r",stdin);
//	freopen("P5482.out","w",stdout);
	read(n);
	while(n--){
		string opt;
		cin>>opt;
		int a,b,c,t;
		if(opt=="Add"){
			read(a,b,c);
			if(a==0&&b>c){
				ans++;
				cnt[++m]=node(0,1,1);
				continue;
			}
			else if(a==0&&b<=c)cnt[++m]=node(0,-1,1);
			else if(a>0){
				t=floor((0.0+c-b)/a);
				if(t>1e6)cnt[++m]=node(t,-1,1);
				else if(t<-1e6)cnt[++m]=node(t,1,1),ans++;
				else {
					t+=N;
					lar.update(t,1);
					cnt[++m]=node(t,2,1);
				}
			}
			else {
				t=ceil((0.0+c-b)/a);
				if(t>1e6)cnt[++m]=node(t,1,1),ans++;
				else if(t<-1e6)cnt[++m]=node(t,-1,1);
				else {
					t+=N;
					sma.update(t,1);
					cnt[++m]=node(t,3,1);
				}
			}
		}
		else if(opt=="Del"){
			read(a);
			if(!cnt[a].flag)continue;
			if(cnt[a].type==2)lar.update(cnt[a].t,-1);
			else if(cnt[a].type==3)sma.update(cnt[a].t,-1);
			else if(cnt[a].type==1)ans--;
			cnt[a].flag=0;
		}
		else{
			read(a);
			printf("%d\n",lar.query(1,a+N)+sma.query(a+N,N*2-2)+ans);
		}
	}
	return 0;
}
2023/10/14 21:28
加载中...