题目大意:
有一个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; }