题目传送门
。
解法:
好神啊。
sum[i]表示前i个有多少个球。
那么询问一次i,j表示sum[i]-sum[j-1]的奇偶性。
那么只要所有的sum都出现一次就绝对可以算出来了。
如果
问了3 5
问了6 8
那么就不需要问3 8了。
所以。
最小生成树呀!
代码实现:
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
struct node {int x,y;ll c;}a[5100000];int len;
bool cmp(node n1,node n2) {return n1.c<n2.c;}
int fa[2100];int findfa(int x) {if(fa[x]!=x)fa[x]=findfa(fa[x]);return fa[x];}
int main() {
int n;scanf("%d",&n);len=0;
for(int i=1;i<=n;i++)for(int j=i;j<=n;j++) {len++;a[len].x=i-1;a[len].y=j;scanf("%lld",&a[len].c);}
sort(a+1,a+1+len,cmp);int t=0;for(int i=0;i<=n;i++)fa[i]=i;ll ans=0;
for(int i=1;i<=len;i++) {
int xx=findfa(a[i].x),yy=findfa(a[i].y);
if(xx!=yy) {
fa[xx]=yy;t++;ans+=a[i].c;if(t==n) {printf("%lld\n",ans);return 0;}
}
}printf("%lld\n",ans);
return 0;
}