[bzoj3714] [PA2014] Kuglarz(最小生成樹)
阿新 • • 發佈:2018-11-10
我們考慮這個題。。。思路比較神仙。
就是我們設\(sum[i]\)為前i個的區間裡的情況,然後我們知道\(sum[j]\)的話,我們就可以知道\(j-i\)的情況了
所以說這很像最小生成樹裡面的約束條件是吧qwq
就是不存在環的性質。。。。
所以我們考慮建圖,然後跑最小生成樹就可以了。。。。
然後就是kruskal板子啦qwqwq
#include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #include<cstring> #define MAXN 4000010 using namespace std; int n,cnt,tot; int fa[MAXN]; long long ans; struct Node{int x,from,to;}node[MAXN]; inline int find(int x) { if(fa[x]==x) return x; return fa[x]=find(fa[x]); } bool cmp(Node x,Node y) { if(x.x<y.x) return 1; else return 0; } int main() { scanf("%d",&n); for(int i=0;i<n;i++) for(int j=i+1;j<=n;j++) scanf("%d",&node[++cnt].x),node[cnt].from=i,node[cnt].to=j; for(int i=0;i<=n;i++) fa[i]=i; sort(node+1,node+1+cnt,cmp); for(int i=1;i<=cnt;i++) { int a=find(node[i].from); int b=find(node[i].to); if(a!=b) { fa[a]=b; tot++; ans+=node[i].x; } if(tot==n) break; } cout<<ans<<endl; return 0; }