码迷,mamicode.com
首页 > 其他好文 > 详细

[BZOJ3714][PA2014]Kuglarz

时间:2018-03-28 15:40:26      阅读:112      评论:0      收藏:0      [点我收藏+]

标签:a20   const   一起   mem   etc   www.   pa2014   include   ++   

bzoj

sol

显然你要知道每个位置下球的情况就要知道每个\(sum_i-sum_{i-1}\)吧。

其实一个询问\(i,j\)就是告诉你\(sum_j-sum_{i-1}\)的奇偶性,那么此时\(sum_j\)\(sum_{i-1}\)这两个变量就相互关联了吧。

那么实际上就是要你使用最小的代价,把\(sum_1...sum_n\)\(n\)个变量全都联系在一起。

模型转化为最小生成树。
\(Prim\)即可。

code

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
#define ll long long
int gi()
{
    int x=0,w=1;char ch=getchar();
    while ((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
    if (ch=='-') w=0,ch=getchar();
    while (ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
    return w?x:-x;
}
const int N = 2e3+5;
int n,c[N][N],dis[N],vis[N];
ll ans;
int main()
{
    n=gi()+1;
    for (int i=1;i<n;++i)
        for (int j=i+1;j<=n;++j)
            c[i][j]=c[j][i]=gi();
    memset(dis,63,sizeof(dis));dis[1]=0;
    for (int t=1;t<=n;++t)
    {
        int p=0;
        for (int i=1;i<=n;++i) if (!vis[i]) p=dis[i]<dis[p]?i:p;
        vis[p]=1;ans+=dis[p];
        for (int i=1;i<=n;++i) if (!vis[i]) dis[i]=min(dis[i],c[p][i]);
    }
    printf("%lld\n",ans);return 0;
}

[BZOJ3714][PA2014]Kuglarz

标签:a20   const   一起   mem   etc   www.   pa2014   include   ++   

原文地址:https://www.cnblogs.com/zhoushuyu/p/8663523.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!