首先发现比赛得分非0即1,能看出时二分图的完美匹配问题。
hall定理:对于X集合中的任意k个点,都与Y集合中至少k个点相邻,则有完美匹配。
根据这个定理,我们将比赛作为X集合,将队伍得分一分一分地拆开就可以对应。
那么任意k个队伍之间进行了k*(k-1)/2场比赛,那么这k支队伍的得分至少为k*(k-1)/2;即对应了至少k*(k-1)/2个点。
所以我们将得分从小到大排序,从头开始,按照所叙比较得分大小是否合法,根据hall定理,就可以判断是否存在完美匹配。
注意
如果得分和不等于n*(n-1)/2,那肯定是错的,这个特判一下先跑再说。
#include<bits/stdc++.h>
#define int long long
using namespace std;
#define in read()
int in{
int cnt=0,f=1;char ch=0;
while(!isdigit(ch)){
ch=getchar();if(ch=='-')f=-1;
}
while(isdigit(ch)){
cnt=cnt*10+ch-48;
ch=getchar();
}return cnt*f;
}
int t,n;
int a[50003];
signed main(){
t=in;
while(t--){
n=in;int tot=0;
for(int i=1;i<=n;i++)tot+=a[i]=in;
if(tot!=(n*(n-1)/2)){
printf("The data have been tampered with!\n");continue;
}
sort(a+1,a+n+1);int flag=0;
int sum=0;
for(int i=1;i<=n;i++){
sum+=a[i];if(sum<(i*(i-1)/2)){
printf("The data have been tampered with!\n");flag=1;break;
}
}if(flag==1)continue;
printf("It seems to have no problem.\n");
}
return 0;
}