毒瘤题,注意下正数负数的取值就好了...
#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;
}

京公网安备 11010502036488号