BZOJ 2762 JLOI2011 不等式组 树状数组

题目大意:给定一些形如ax+b>c的不等式,支持插入和修改,以及询问当x=k时有多少不等式成立

将不等式变形 可以得到每个不等式成立时x的取值范围 在树状数组上统计即可

注意事项:

1.a可以等于0 此时若b>c x∈R 若b<=c x∈?

2.x的取值范围可能超过[-1000000,1000000]

3.由于有负数 所以区间修改时左右端点都要加上1000001 若加上1000000则死循环

4.小于不是小于等于 注意整除是的讨论 我的做法是x>y大于就是x>=floor(y)+1 x<y就是x<=ceil(y)-1 这里不要加EPS否则会死

5.很坑的一点是数据虽然说保证合法但是我们可以无视这句话了…… 有重复删除的不等式 需要记录

简直可怕

#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define M 100100
#define RANGE 1000000
using namespace std;
int n,tot;
pair<int,int> intervals[M];
bool v[M];
int c[RANGE<<1|0xffff];
inline void Update(int x,int y)
{
	for(;x<=(RANGE<<1|1);x+=x&-x)
		c[x]+=y;
}
inline int Get_Ans(int x)
{
	int re=0;
	for(;x;x-=x&-x)
		re+=c[x];
	return re;
}
pair<int,int> Get_Interval(int a,int b,int c)
{
	if(a==0)
	{
		if(b>c) return make_pair(-RANGE,RANGE);
		else return make_pair(1,0);
	}
	else if(a>0)
	{
		int temp=floor(double(c-b)/a+1);
		if(temp<-RANGE)
			return make_pair(-RANGE,RANGE);
		if(temp>RANGE)
			return make_pair(1,0);
		return make_pair(temp,RANGE);
	}
	{
		int temp=ceil(double(c-b)/a-1);
		if(temp>RANGE)
			return make_pair(-RANGE,RANGE);
		if(temp<-RANGE)
			return make_pair(1,0);
		return make_pair(-RANGE,temp);
	}
}
inline void Update(pair<int,int> x,int y)
{
	Update(x.first+RANGE+1,y);
	Update(x.second+RANGE+2,-y);
}
int main()
{
	int i,a,b,c,x;
	char p[10];
	cin>>n;
	for(i=1;i<=n;i++)
	{
		scanf("%s",p);
		switch(p[0])
		{
			case 'A':
				scanf("%d%d%d",&a,&b,&c);
				intervals[++tot]=Get_Interval(a,b,c);
				Update(intervals[tot],1);
				break;
			case 'Q':
				scanf("%d",&x);
				printf("%d\n", Get_Ans(x+RANGE+1) );
				break;
			case 'D':
				scanf("%d",&x);
				if(v[x]) break;v[x]=1;
				Update(intervals[x],-1);
				break;
		}
	}
}
时间: 2024-07-31 02:37:57

BZOJ 2762 JLOI2011 不等式组 树状数组的相关文章

Codevs 3286 火柴排队 2013年NOIP全国联赛提高组 树状数组,逆序对

题目:http://codevs.cn/problem/3286/ 3286 火柴排队  2013年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度.现在将每盒中的火柴各自排成一列,同一列火柴的高度互不相同,两列火柴之间的距离定义为:,其中 ai表示第一列火柴中第 i 个火柴的高度,bi表示第二列火柴中第 i 个火柴的高度.每列火柴中相

[BZOJ 1901] Dynamic Rankings 【树状数组套线段树 || 线段树套线段树】

题目链接:BZOJ - 1901 题目分析 树状数组套线段树或线段树套线段树都可以解决这道题. 第一层是区间,第二层是权值. 空间复杂度和时间复杂度均为 O(n log n). 代码 树状数组套线段树 #include <iostream> #include <cstdlib> #include <cstdio> #include <cmath> #include <algorithm> #include <cstring> usin

bzoj 2527 Meteors - 整体二分 - 树状数组

Description Byteotian Interstellar Union (BIU) has recently discovered a new planet in a nearby galaxy. The planet is unsuitable for colonisation due to strange meteor showers, which on the other hand make it an exceptionally interesting object of st

BZOJ 1103 大都市(dfs序+树状数组)

应该是一道很水的题吧... 显然可以用树链剖分解决这个问题,虽然不知道多一个log会不会T.但是由于问题的特殊性. 每次修改都是将边权为1的边修改为0,且询问的是点i到根节点的路径长度. 令点i到根节点的路径长度为w[i],显然初始时w[i]=dep[i].考虑修改边为(u,v),那么令u为深度大的点. 那么u的子树的所有答案就要减1.考虑dfs序,则每次需要修改的是一段连续的区间. 树状数组维护单点查询,区间修改,美滋滋. # include <cstdio> # include <c

BZOJ 1396:识别子串 SA+树状数组+单调队列

1396: 识别子串 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 381  Solved: 243[Submit][Status][Discuss] Description Input 一行,一个由小写字母组成的字符串S,长度不超过10^5 Output L行,每行一个整数,第i行的数据表示关于S的第i个元素的最短识别子串有多长. Sample Input agoodcookcooksgoodfood Sample Output 1 2 3 3

BZOJ 3211 花神游历各国 树状数组(线段树)+优化

题意:给你一段区间,然后每个点的初始值都告诉你,现有两种操作,一种是给你一个小区间的左右端点,之后把这个区间内的所有值都开根号,另一种就是区间求值. 方法:树状数组维护求和,巧妙开根号.(线段树) 解析:这道是某次考试考的题- -.当时也没想到快的开根号方法,暴力开根号好像70分吧. 首先要明确一个事情:被开根号的数最大是109,而109开几次会开到1呢?用计算器算一下发现5次就将这个最大的数开到1了,而1开根号怎么开都是1,所以如果再对其进行开根号操作,仅仅是无用的浪费时间了.所以怎么维护这种

[BZOJ 3196] 二逼平衡树 树状数组套主席树

3196: Tyvj 1730 二逼平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3357  Solved: 1326[Submit][Status][Discuss] Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:1.查询k在区间内的排名2.查询区间内排名为k的值3.修改某一位值上的数值4.查询k在区间内的前驱(前驱定义为小于x,且最大的数)5.查询k在区间内的后继(后继定义为

【BZOJ】1452: [JSOI2009]Count 树状数组

Description Input Output Sample Input Sample Output 1 2 HINT 题解: 二维的树状数组啊+一维的颜色状态,然后直接做就好……实际上比照一维的树状数组就是多了一个for循环,然后查询操作的时候就相当于查询某一矩阵的大小,树状数组起到一个类似前缀和的作用.   1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 #include <

BZOJ 3211 花神游历各国 树状数组+并查集

题目大意:花神对每一个国家有一个喜爱程度,有的时候他会对连续的一段国家进行访问,求他的喜爱程度的和:有的时候他会对连续的一段国家产生厌恶,喜爱程度变成sqrt(x)下取整. 思路:乍一看好像是RMQ问题,用线段树就可以水过,但是开根号的标记怎么下传?这是一个严重的问题,所以我们要换一个思路. 注意到开根号有一个有趣的性质:sqrt(1) = 1,sqrt(0) = 0,而且所有的数字经过有限次的开根号运算都会变成1.这个性质就很好了.我们对每一个点暴力开根号,然后当这个店的点权变成1的时候就打一