HDU5517 沈阳现场赛 二维树状数组

/*
为b弄一个数组,存放最大的a的个数,
vec[i]来存放a,c,d中的c,d以及a,c,d这个元素的元素
然后从大到小枚举a(从小到大好像不可以,因为不知道是上一次a在二维树状中在x,y这个点放了一次还是当前枚举的a在x,y这个点放了一次)
然后二维树状数组判断区域中有无点,再更新,搞定
*/
#include 
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long ll;
const int maxn = 100005;

struct ppp{
	int a,b;
	void read(){
		scanf("%d%d",&a,&b);
	}
}A[maxn];
struct pp{
	int c,d,e;
	void read(){
		scanf("%d%d%d",&c,&d,&e);
	}
}B[maxn];
struct ttt{
	int x,y,cnt;
	ttt(int _c,int _d,int _cnt){
		x = _c,y = _d,cnt = _cnt;
	}
};
int n,m;
int max_a[maxn][2];
vector vec[maxn];
int sum[1005][1005];
inline int lowbit(int x){
	return x & -x;
}
int query(int x,int y){
	int ret = 0;
	for(int i = x;i >= 1;i -= lowbit(i)){
		for(int j = y;j >= 1;j -= lowbit(j)){
			ret += sum[i][j];
		}
	}
	return ret;
}
void add(int x,int y){
	for(int i = x;i <= 1000;i += lowbit(i)){
		for(int j = y;j <= 1000;j += lowbit(j)){
			sum[i][j] += 1;
		}
	}
}
int cmp(ttt a,ttt b){
	return (a.x != b.x) ? a.x > b.x : a.y > b.y;
}

void init(){
	for(int i= 0;i < maxn;i++){
		max_a[i][0] = max_a[i][1] = 0;
		vec[i].clear();
	}
	for(int i = 1,a,b;i <= n;i++){
		scanf("%d%d",&a,&b);
		if(max_a[b][0] < a){
			max_a[b][0] = a;
			max_a[b][1] = 1;
		}else if(max_a[b][0] == a){
			max_a[b][1]++;
		}
	} 
	for(int i = 1,c,d,e;i <= m;i++){
		scanf("%d%d%d",&c,&d,&e);
		if(max_a[e][1] != 0){
//			cout<= 0;i--){
			for(int j = 0;j < vec[i].size();j++){
				if(vec[i][j].cnt == 0)continue;
				now = query(1000,1000);
				now -= query(vec[i][j].x - 1,1000);
				now -= query(1000,vec[i][j].y - 1);
				now += query(vec[i][j].x - 1,vec[i][j].y - 1);
				if(now <= 0){
					ans += vec[i][j].cnt;
					add(vec[i][j].x,vec[i][j].y);
//					cout<

你可能感兴趣的:(HDU题解)