题目大意:
有一个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
",ans);
return 0;
}