毒瘤题,注意下正数负数的取值就好了...
#include <bits/stdc++.h> using namespace std; const int N=2e6+5,M=10,base=1e6+1; char s[M];int pos[N/10],sum[N],id,vis[N/10]; int lowbit(int x) { return x&(-x); } void add(int pos,int val) { while(pos<=N-1) { // if(f) cout<<pos<<endl; sum[pos]+=val; pos+=lowbit(pos); } } int query(int pos) { int res=0; while(pos) { res+=sum[pos]; pos-=lowbit(pos); } return res; } int main() { int T,x; scanf("%d",&T); while(T--) { scanf("%s",s+1); if(s[1]=='A') { int a,b,c; scanf("%d%d%d",&a,&b,&c); if(a>0) { x=(c-b)/a; if((c-b) > 0){ x ++; } else{ if((c - b) % a == 0) x ++; } if(x<-1000000) x=1; else if(x>1000000) x=2000000+4; else x+=base; add(x,1); pos[++id]=x; } else if(a==0) { if(b>c) x=1; else x=2000000+4; add(x,1); pos[++id]=x; } else { x=(c-b)/a; if(c - b <= 0) { if((c - b) % a == 0) x --; } else{ x --; } //cout<<x<<endl; if(x<-1000000) //没贡献. { x=2000000+4; add(x,1); pos[++id]=x; } else if(x>1000000)//都有贡献. { x=1; add(x,1); pos[++id]=x; } else { x+=base; //cout<<x+1<<endl; add(1,1); //cout<<x+1<<endl; add(x+1,-1); pos[++id]=-x; } } } else if(s[1]=='D') { int i; scanf("%d",&i); if(vis[i]) continue; vis[i]=1; if(pos[i]>=0) add(pos[i],-1); else { add(1,-1);add(-pos[i]+1,1); } } else { int k; k--; scanf("%d",&k);k+=base; printf("%d\n",query(k)); } } return 0; }