zoukankan      html  css  js  c++  java
  • 【BZOJ2762】[JLOI2011]不等式组 树状数组

    【BZOJ2762】[JLOI2011]不等式组

    Description

    旺汪与旺喵最近在做一些不等式的练习。这些不等式都是形如ax+b>c 的一元不等式。当然,解这些不等式对旺汪来说太简单了,所以旺喵想挑战旺汪。旺喵给出一组一元不等式,并给出一个数值 。旺汪需要回答的是x=k 时成立的不等式的数量。聪明的旺汪每次都很快就给出了答案。你的任务是快速的验证旺汪的答案是不是正确的。

    Input

    输入第一行为一个正整数 ,代表接下来有N 行。
    接下来每一行可能有3种形式:
    1.“Add a b c”,表明要往不等式组添加一条不等式ax+b>c ;
    2.“Del i”,代表删除第i 条添加的不等式(最先添加的是第1条)。
    3.“Query k”,代表一个询问,即当x=k 时,在当前不等式组内成立的不等式的数量。
    注意一开始不等式组为空,a,b,c,i,k 均为整数,且保证所有操作均合法,不会出现要求删除尚未添加的不等式的情况。

    Output

     
    对于每一个询问“Query k”,输出一行,为一个整数,代表询问的答案。

    Sample Input

    9
    Add 1 1 1
    Add -2 4 3
    Query 0
    Del 1
    Query 0
    Del 2
    Query 0
    Add 8 9 100
    Query 10

    Sample Output

    1
    1
    0
    0

    HINT

    第1条添加到不等式组的不等式为x+1>1 ,第2条为-2x+4>3 ,所以第1个询问的时候只有第2条不等式可以成立,故输出1。

    然后删除第1条不等式,再询问的时候依然是只有第2条不等式可以成立,故输出1。

    再删除第2条不等式后,因为不等式组里面没有不等式了,所以没有不等式可以被满足,故输出0。

    继续加入第3条不等式8x+9>100 ,当x=k=10时有8*10+9=89<100,故也没有不等式可以被满足,依然输出0。

    数据范围:

    20%的数据, N<=1000; 

    40%的数据, N<=10000;

    100%的数据,N<=100000,

    a,b,c的范围为[-10^8,10^8],k的范围为[-10^6,10^6]。

    题解: 一元一次不等式怎么解?移个项就完事了~但是a可能是正数也可能是负数,所以要分两种情况讨论,然后不等式就变成了x>...或x<...,变成x>=...+eps或x<=...-eps,这样的话就能直接用树状数组了。

    但是树状数组的下标可能是负数,那么就将下边全都+=1000002;虽然x在[-1e6,1e6]之间,但是不等式右边不一定是,那么将超过这个范围的都用极小(大)值表示即可。

    还有,a可能等于0,特判掉即可。

    最后,可能出现重复删除的情况。。。

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <cmath>
    #include <algorithm>
    using namespace std;
    const int maxn=100010;
    int n,m,sum,ok;
    struct node
    {
    	int val,org;
    	node() {}
    	node(int _1,int _2)	{val=_1,org=_2;}
    }p[maxn];
    char str[10];
    int op[maxn],v[maxn],flag[maxn],vis[maxn];
    struct BIT
    {
    	int s[2000010];
    	inline void updata(int x,int val)
    	{
    		if(x>1000000)	x=2000003;
    		else	if(x<-1000000)	x=1;
    		else	x+=1000002;
    		for(int i=x;i<=2000003;i+=i&-i)	s[i]+=val;
    	}
    	inline int query(int x)
    	{
    		x+=1000002;
    		int i,ret=0;
    		for(i=x;i;i-=i&-i)	ret+=s[i];
    		return ret;
    	}
    }s1,s2;
    inline int rd()
    {
    	int ret=0,f=1;	char gc=getchar();
    	while(gc<'0'||gc>'9')	{if(gc=='-')f=-f;	gc=getchar();}
    	while(gc>='0'&&gc<='9')	ret=ret*10+gc-'0',gc=getchar();
    	return ret*f;
    }
    bool cmp(const node &a,const node &b)
    {
    	return a.val<b.val;
    }
    int main()
    {
    	n=rd();
    	int i,j,a,b,c;
    	for(i=1,j=0;i<=n;i++)
    	{
    		scanf("%s",str);
    		if(str[0]=='A')
    		{
    			a=rd(),b=rd(),c=rd(),j++;
    			if(a>0)	flag[j]=1,v[j]=ceil((double)(c-b)/a+1e-8),s1.updata(v[j],1);
    			if(a<0)	flag[j]=-1,v[j]=floor((double)(c-b)/a-1e-8),s2.updata(v[j],1),sum++;
    			if(!a)	flag[j]=0,v[j]=(b>c),ok+=v[j];
    		}
    		if(str[0]=='D')
    		{
    			a=rd();
    			if(vis[a])	continue;
    			vis[a]=1;
    			if(flag[a]==1)	s1.updata(v[a],-1);
    			if(flag[a]==-1)	s2.updata(v[a],-1),sum--;
    			if(!flag[a])	ok-=v[a];
    		}
    		if(str[0]=='Q')
    		{
    			a=rd(),printf("%d
    ",s1.query(a)+sum-s2.query(a-1)+ok);
    		}
    	}
    	return 0;
    }//9 Add 1 1 1 Add -2 4 3 Query 0 Del 1 Query 0 Del 2 Query 0 Add 8 9 100 Query 10
  • 相关阅读:
    Memcached使用与纠错(附代码和相关dll)
    python函数
    python操作文件
    python基础2
    SpringMVC中使用@ResponseBody注解将任意POJO对象返回值转换成json进行返回
    利用aspose-words 实现 java中word转pdf文件
    POI各Jar包的作用(转)
    java利用poi 把ppt转化为图片,
    SpringMVC中 解决@ResponseBody注解返回中文乱码
    springMVC 使用注解注入接口实现类
  • 原文地址:https://www.cnblogs.com/CQzhangyu/p/7560131.html
Copyright © 2011-2022 走看看