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

原创 2015年11月19日 22:21:05
/*
为b弄一个数组,存放最大的a的个数,
vec[i]来存放a,c,d中的c,d以及a,c,d这个元素的元素
然后从大到小枚举a(从小到大好像不可以,因为不知道是上一次a在二维树状中在x,y这个点放了一次还是当前枚举的a在x,y这个点放了一次)
然后二维树状数组判断区域中有无点,再更新,搞定
*/
#include <bits/stdc++.h>
#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<ttt> 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<<max_a[e][0]<<" "<<max_a[e][1]<<endl;
			vec[max_a[e][0]].push_back(ttt(c,d,max_a[e][1]));
		}
	}
	mem(sum,0);
}

int main(){
	int T;
	scanf("%d",&T);
	for(int cas = 1;cas <= T;cas++){
		scanf("%d%d",&n,&m);
		init();
		for(int i = 0;i < maxn;i++)sort(vec[i].begin(),vec[i].end(),cmp);
		for(int i = 0;i < maxn;i++){
			for(int j = 1;j < vec[i].size();j++){
				if(vec[i][j - 1].x == vec[i][j].x && vec[i][j - 1].y == vec[i][j].y){
					vec[i][j].cnt += vec[i][j - 1].cnt;
					vec[i][j - 1].cnt = 0;
				}
			}
		}
		int now;
		int ans = 0;
		for(int i = maxn - 1;i >= 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<<i<<" "<<vec[i][j].x<<" "<<vec[i][j].y<<" "<<vec[i][j].cnt<<endl;
				}
			}
		}
		printf("Case #%d: %d\n",cas,ans);
	}
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

[HDU 5517][2015ACM/ICPC亚洲区沈阳站] Triple 二维树状数组

Triple Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total ...
  • ALPS233
  • ALPS233
  • 2016年04月20日 15:38
  • 406

HDU 5517 Triple (2015沈阳站I题&&二维树状数组)

题意:给一个nn个二元组:,给mm个三元组:。如果b=eb=e那么可以合并二元组,三元组,得到一个新的三元组:。设所有的二元组,三元组组合后得到的新的三元组的集合是CC。 求CC集合中满足条件的三元...

hdu5517_Triple_二维树状数组

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5517 题意:

HDU 5517 Triple(去重+线段树|二维树状数组)

题面比较恶心,不过题意就是三元组去重之后,问你有多少个三元组题面比较恶心,不过题意就是三元组去重之后,问你有多少个三元组 没有任何一个三元组,三个参数都大于等于它的三个参数没有任何一个三元组,三个参...

hdu 5517 Triple(二维树状数组)

题目链接:hdu 5517 Triple解题思路预处理出点,并且去重,重复点的个数用一个权值表示,这样点最多有1e5个,然后用二维树状数组做一遍。代码#include #include #incl...

树状数组 逆序对变形 2017HZAU现场赛G-Sequence Number

题目链接:http://acm.hzau.edu.cn/problem.php?cid=1029&pid=6题意:给你n个数(1

hdu5521Meeting【最短路】2015沈阳现场赛

Problem Description Bessie and her friend Elsie decide to have a meeting. However, after Farmer Joh...

hdu 5950 Recursive sequence 2016ACM/ICPC沈阳赛区现场赛C

Problem Description Farmer John likes to play mathematics games with his N cows. Recently, they are...
  • lqybzx
  • lqybzx
  • 2016年10月31日 20:10
  • 564

hdu5521 Meeting 最短路 2015ACM/ICPC亚洲区沈阳站现场赛

题意:共有N个点,每si个点为一个集合,集合内部任意两点的路程所需时间为ti, 两个人分别住在点1和点N,问两人从自己住的地方,找一个点相遇,要求两人用最短的时间相遇。 思路:看到这个题有点蒙,因为s...

hdu 5952 Counting Cliques 2016ACM/ICPC沈阳赛区现场赛E

Problem Description A clique is a complete graph, in which there is an edge between every pair of...
  • lqybzx
  • lqybzx
  • 2016年10月31日 20:15
  • 419
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:HDU5517 沈阳现场赛 二维树状数组
举报原因:
原因补充:

(最多只允许输入30个字)