2017.9.13 不等式组 思考记录

来源:互联网 发布:地球大炮 知乎 编辑:程序博客网 时间:2024/06/05 03:58

深深感到数学差的悲哀、连分类讨论都讨论不全,而且会晕、

所以分类讨论:

分成 大于号和 小于号 两种情况讨论

如果a>0,一定是大于号

如果右边是大于0的小数,那一定是上取整

如果右边是大于0的整数,那一定是+1

如果右边是小于0的小数,那一定是下取整

如果右边是小于0的整数,那一定是+1


如果a<0,一定是小于号

如果右边是大于0的小数,那一定是下取整

如果右边是大于0的整数,那一定是-1

如果右边是小于0的小数,那一定是上取整

如果右边是小于0的整数,那一定是-1


上面是同级的,所以要注意避免包含的情况,

然后abc范围是1e8的只有1e6是有用的,要注意取1e6(不读题TLE好几遍)

因为没有乘法,可以用double来判断是小数还是整数


由于满足的连续性,就可以建树状数组维护前缀和,由于大于和小于的序列是不一样的,所以维护两颗树状数组


码:

#include<iostream>#include<cstdio>using namespace std;#define N 4000006int f1[N],f2[N];int cz[N][3],a,b,c,n,cnt;char ch[999];int lowbit(int a){return (a&(-a));}int jiady(int a,int qi){for(;qi<=3000001;qi+=lowbit(qi)){f1[qi]+=a;}}int jiaxy(int a,int qi){for(;qi<=3000001;qi+=lowbit(qi)){f2[qi]+=a;}}int xwdy(int qi){int ans=0;for(;qi>0;qi-=lowbit(qi)){ans+=f1[qi];}return ans;}int xwxy(int qi){int ans=0;for(;qi>0;qi-=lowbit(qi)){ans+=f2[qi];}return ans;}int main(){ int i;scanf("%d",&n);for(i=1;i<=n;i++){scanf("%s",ch);if(ch[0]=='A'){scanf("%d%d%d",&a,&b,&c);++cnt;cz[cnt][0]=1;if(a==0){if(b>c){cz[cnt][1]=1;jiaxy(1,1);}else cz[cnt][0]=0;}if(a<0){double o=double(c-b)/double(a);int lin;if(o==int(o))lin=o-1;elseif(o>0)lin=int(o);elseif(o<0)lin=int(o-0.99999999);if(lin>1000000)lin=1000001;if(lin<-1000000)lin=-1000001;cz[cnt][1]=1500001-lin;jiaxy(1,1500001-lin);}if(a>0)     {     double o=double(c-b)/double(a);     int lin;if(o==int(o))lin=o+1;else if(o>0)lin=int(o+0.99999999);else if(o<0)lin=int(o);if(lin>1000000)lin=1000001;if(lin<-1000000)lin=-1000001;cz[cnt][2]=1500001+lin;jiady(1,1500001+lin); }}if(ch[0]=='D'){scanf("%d",&a);if(cz[a][0]){cz[a][0]=0;if(cz[a][1]>0){jiaxy(-1,cz[a][1]);}if(cz[a][2]>0){jiady(-1,cz[a][2]);}}}if(ch[0]=='Q'){   scanf("%d",&a);int ans=0;ans+=xwxy(1500001-a);ans+=xwdy(1500001+a);printf("%d\n",ans);}}}




原创粉丝点击