BZOJ3714 [PA2014]Kuglarz

来源:互联网 发布:互联网共享打印机端口 编辑:程序博客网 时间:2024/05/17 10:42

知道了第x~y个杯子的奇偶性,就相当于知道了x和x-1之间的缝到y和y+1之间的缝的奇偶性

知道了缝a到缝b的奇偶性和缝b到缝c的奇偶性,我们就知道了缝a到缝c的奇偶性

要知道所有杯子底下有没有球,我们就要知道每个杯子左右两端的缝之间的奇偶性,也就相当于要知道任意两个缝之间的奇偶性

所以这就是一道花式最小生成树问题-_-知道奇偶性相当于连一条边,整个图联通了就都能知道了

#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<ctime>#include<cmath>#include<algorithm>#include<iomanip>#include<vector>#include<map>#include<set>#include<bitset>#include<queue>#include<stack>using namespace std;#define MAXN 2010#define MAXM 1010#define INF 1000000000#define MOD 1000000007#define eps 1e-8#define ll long longstruct edg{int x;int y;int v;friend bool operator <(edg x,edg y){return x.v<y.v;}};int f[MAXN];edg e[MAXN*MAXN];int tot;ll ans;int n;int fa(int x){return f[x]==x?x:f[x]=fa(f[x]);}void kruskal(){int i;for(i=0;i<=n;i++){f[i]=i;}sort(e+1,e+tot+1);for(i=1;i<=tot;i++){if(fa(e[i].x)!=fa(e[i].y)){ans+=e[i].v;f[fa(e[i].x)]=fa(e[i].y);}}}int main(){int i,j;scanf("%d",&n);for(i=0;i<n;i++){for(j=i+1;j<=n;j++){scanf("%d",&e[++tot].v);e[tot].x=i;e[tot].y=j;}}kruskal();printf("%lld\n",ans);return 0;}/**/


0 0