BZOJ 3714: [PA2014]Kuglarz

题目大意:
有一个0/1序列,每次可以询问任意一段的奇偶性,但有代价。

问确定这个序列所花的最小代价。

题解:
令sum[i]表示前缀和的奇偶,询问了sum[r]-sum[l-1]的奇偶,已知sum[0]的奇偶,求所有前缀的奇偶。

最小生成树。

代码:

 

#include<cstdio>
#include<algorithm>
using namespace std;
int n,cnt,f[2500005];
long long ans;
struct node{
	int x,y,val;
}a[2200005];
bool cmp(node a,node b){
	return a.val<b.val;
}
int find(int x){
	if (f[x]!=x) f[x]=find(f[x]);
	return f[x];
}
int main(){
	scanf("%d",&n);
	ans=1e9;
	for (int i=1; i<=n; i++)
		for (int j=1; j<=n-i+1; j++){
			a[++cnt].x=i-1;
			a[cnt].y=i+j-1;
			scanf("%d",&a[cnt].val);
		}
	sort(a+1,a+cnt+1,cmp);
	long long ans=0;
	for (int i=0; i<=n; i++) f[i]=i;
	for (int i=1; i<=cnt; i++){
		int fx=find(a[i].x),fy=find(a[i].y);
		if (fx!=fy){
			f[fy]=fx;
			ans+=a[i].val;
		}
	}
	printf("%lld\n",ans);
	return 0;
}

 

  

 

posted @ 2018-04-09 14:19  ~Silent  阅读(424)  评论(0编辑  收藏  举报
Live2D