首页 > 其他 > 详细

Japan POJ - 3067

时间:2021-06-19 00:07:43      阅读:23      评论:0      收藏:0      [点我收藏+]

原题链接
考察:树状数组
错误思路:
??按顺序加入线段,对于每个线段左右端点,求min(左端点往上的个数,右端点往下的个数),min(左端点往下的个数,右端点往上的个数)
错误原因:
当数据出现:
1 1
3 3
2 2
就会计算错误.
思路:
??排序,按左端点排序,求右端点的逆序对.

Code

#include <iostream> 
#include <cstring>
#include <algorithm>
#include <cstdio>
using namespace std;
typedef long long LL;
typedef pair<int,int> PII;
const int N = 1010,K = 1000010;
PII p[K];
int n,m,k;
LL tr[2][N];
int lowbit(int x)
{
	return x&-x;
}
LL query(int idx,int n)
{
	LL res = 0;
	for(int i=n;i;i-=lowbit(i)) 
	  res+=tr[idx][i];
	return res;
}
void add(int idx,int k,int x)
{
	int maxn = idx?m:n;
	for(int i=k;i<=maxn;i+=lowbit(i)) 
	  tr[idx][i]+=x;
}
int main()
{
	int T,kcase = 0;
	scanf("%d",&T);
	while(T--)
	{
		scanf("%d%d%d",&n,&m,&k);
		memset(tr,0,sizeof tr);
		LL res =0;
		for(int i=1;i<=k;i++) scanf("%d%d",&p[i].first,&p[i].second);
		sort(p+1,p+k+1);
		for(int i=1;i<=k;i++)
		{
			int l,r;
			l = p[i].first,r = p[i].second;
			LL a = query(0,l-1);
			LL b = query(1,m) - query(1,r);
			res+=min(a,b);
			a = query(0,n)-query(0,l);
			b = query(1,r-1);
			res+=min(a,b);
			add(0,l,1);
			add(1,r,1);
		}
		printf("Test case %d: %lld\n",++kcase,res);
	}
	return 0;
}

Japan POJ - 3067

原文:https://www.cnblogs.com/newblg/p/14901483.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!