HDU 1556 Color the ball [区间更新+单点查询]

树状数组专辑

树状数组,区间更新+单点查询


代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#include<string>
#include<vector>
#include<map>
#include<algorithm>
using namespace std;
inline int Rint() { int x; scanf("%d", &x); return x; }
inline int max(int x, int y) { return (x>y)? x: y; }
inline int min(int x, int y) { return (x<y)? x: y; }
#define FOR(i, a, b) for(int i=(a); i<=(b); i++)
#define FORD(i,a,b) for(int i=(a);i>=(b);i--)
#define REP(x) for(int i=0; i<(x); i++)
typedef long long int64;
#define INF (1<<30)
const double eps = 1e-8;
#define bug(s) cout<<#s<<"="<<s<<" "

#define MAXN 100002
int a[MAXN];
int n;		//线段 1~n

inline int lowbit(int x) { return x&(-x); }
//int getsum(int x)		// 区间查询,sum[1, x]
//{
//	int ret = 0;
//	while(x>0)		//合并区间
//	{
//		ret += a[x];
//		x-=lowbit(x);
//	}
//	return ret;
//}
//void insert(int x, int v)	//单点更新,[x] += v
//{
//	while(x<=n)	//pushup,更新到父亲
//	{
//		a[x] += v;
//		x += lowbit(x);
//	}
//}

void update(int x, int v)	//区间更新,[1, x] += v
{
	while(x>0)		//pushdown,更新到儿子
	{
		a[x] += v;
		x -= lowbit(x);
	}
}

int query(int x)	//单点查询,sum of [x]
{
	int ret = 0;
	while(x<=n)	//统计覆盖p点的区间。所有 [1, y], y>=x 的线段。
	{
		ret += a[x];
		x += lowbit(x);
	}
	return ret;
}

int main()
{
	while(scanf("%d", &n)!=-1 && n)
	{
		memset(a, 0, sizeof(a));
		REP(n)
		{
			int l = Rint();
			int r = Rint();
			update(r, 1);
			update(l-1, -1);
		}
		REP(n)
		{
			if(i) putchar(' ');
			printf("%d", query(i+1));
		}
		putchar('\n');
	}
}


阅读更多

没有更多推荐了,返回首页