Description
旺汪与旺喵最近在做一些不等式的练习。这些不等式都是形如ax+b>c 的一元不等式。当然,解这些不等式对旺汪来说太简单了,所以旺喵想挑战旺汪。旺喵给出一组一元不等式,并给出一个数值 。旺汪需要回答的是x=k 时成立的不等式的数量。聪明的旺汪每次都很快就给出了答案。你的任务是快速的验证旺汪的答案是不是正确的。
20%的数据, N<=1000;
40%的数据, N<=10000;
100%的数据,N<=100000,
a,b,c的范围为[-10^8,10^8],k的范围为[-10^6,10^6]。
Solution
心态崩了,写道水题压压惊
注意到我们可以把不等式变形得到x的范围,然后相当于区间加和单点查询了
Code
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <math.h>
#define rep(i,st,ed) for (int i=st;i<=ed;++i)
#define lowbit(x) ((x)&(-(x)))
const int INF=2000001;
const int N=100005;
struct Q {
int l,r;
} q[N];
int c[INF*2+5],qCnt;
bool del[N];
int read() {
int x=0,v=1; char ch=getchar();
for (;ch<'0'||ch>'9';v=(ch=='-')?(-1):(v),ch=getchar());
for (;ch<='9'&&ch>='0';x=x*10+ch-'0',ch=getchar());
return x*v;
}
void add(int x,int v) {
for (;x<=INF;x+=lowbit(x)) c[x]+=v;
}
int get(int x) {
int ret=0;
for (;x;x-=lowbit(x)) ret+=c[x];
return ret;
}
void change(int l,int r,int v) {
if (r<l) return ;
l=std:: max(l,1),r=std:: min(r,INF);
add(l,v); add(r+1,-v);
}
int main(void) {
// freopen("data.in","r",stdin);
// freopen("myp.out","w",stdout);
for (int T=read();T--;) {
char opt=getchar(); for (;opt!='A'&&opt!='D'&&opt!='Q';opt=getchar());
if (opt=='A') {
int a=read(),b=read(),c=read(),l,r;
if (a<0) {
l=1,r=ceil((double)(c-b)/a)+1000000;
} else if (a>0) {
l=floor((double)(c-b)/a)+1000002; r=INF;
} else if (b>c) {
l=1; r=INF;
} else{ l=2; r=1; }
q[++qCnt].l=l; q[qCnt].r=r;
change(l,r,1);
} else if (opt=='D') {
int x=read();
if (!del[x]) {
del[x]=true;
change(q[x].l,q[x].r,-1);
}
} else if (opt=='Q') {
int x=read(); printf("%d\n", get(x+1000001));
}
}
return 0;
}