[BZOJ3714][PA2014]Kuglarz
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;
}