[BZOJ3714][PA2014]Kuglarz

Posted 租酥雨

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[BZOJ3714][PA2014]Kuglarz相关的知识,希望对你有一定的参考价值。

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的主要内容,如果未能解决你的问题,请参考以下文章

bzoj3714[PA2014]Kuglarz*

最小生成树 BZOJ3714 [PA2014]Kuglarz

bzoj 3714 [PA2014]Kuglarz 最小生成树

BZOJ3714[PA2014]Kuglarz 最小生成树

BZOJ3714: [PA2014]Kuglarz

BZOJ 3714: [PA2014]Kuglarz(最小生成树)