@description@

n 个队伍两两之间比赛,保证没有平局。

现在给出 n 个队伍分别的获胜次数,询问这些数据是否合法。

Input

先给出 T(T≤50) 表示数据组数。

对于每组数据给出 n(n≤50000) 表示参赛队伍数。

接下来 n 行,第 i 给出一个整数 ai (0≤ai<n) 表示第 i 个队伍的获胜次数。

Output

对于每组数据,若不合法输出 "The data have been tampered with!",否则输出 "It seems to have no problem."。

Sample Input

2

3

2

1

0

3

2

2

2

Sample Output

It seems to have no problem.

The data have been tampered with!

Hint:

对于第一组数据,一种可能的情况是队伍 1 战胜队伍 2, 3,队伍 2 战胜队伍 3。

对于第二组数据,不难发现不存在一种可能的胜负情况。

@solution@

竞赛图的判定,有一个叫作兰道定理的东西。

但是我这里不详细讲兰道定理的一般证明方法,只提供我在网上看到的一个有趣的推导。

假如胜者向败者连边,则题目相当于给出竞赛图中所有点的出度,问是否存在合法的图。

考虑给无向完全图的边定向得到竞赛图,我们定向为 u->v 时,u 所需要的出度就会少 1。

这会让我们联想起混合图欧拉路中,也是通过给无向边定向调整入度出度。于是联想到网络流。

考虑如下的建模:

从 s 向 n*(n-1) 条边连容量为 1 的边;假如第 i 条边为 (u, v),则 i 向 u 和 v 各连一条容量为 1 的边;最后 n 个顶点向 t 连容量为 a[i] 的边。

假如这个网络流能够满流,则对应原题目中的合法。

但是显然我们直接跑是跑不了的,考虑怎么样才能直接判定。

如果我们将 n 个顶点每一个点拆成 a[i] 个点,则问题可以转为二分图完美匹配的判定性问题,于是就可以引入 hall 定理。

考虑从左边选出一个集合对应的右边的邻集意义是什么,不难发现其实是从原图中选出一个边集,每条边连接的原图中的点的集合。

hall 定理要求邻集必须比当前集合大。反过来,我们考虑给定一个邻集(即对应原图中的点集),能够得到的最大的当前集合有多大——其实就是边集在原图中形成完全图时最大。

于是,我们可以在本题中将 hall 定理等价地推为 \(\frac{|S|*(|S|-1)}{2} \le \sum_{i\in S}a[i]\),对于原图中任意一个点集 S 都要满足。

注意到左边只与 S 的大小有关,我们只需要考虑 S 同等大小的情况下 \(\sum_{i\in S}a[i]\) 的最小值。贪心地想这个最小值一定是 a 中前 |S| 小的加起来。

于是:只需要将 a 排好序,对于每一个 i,如果满足 a[1] + a[2] + ... + a[i] >= i*(i-1)/2 即有解。

当然因为要求完美匹配,所以左右大小应该相等,即应该有 a[1] + a[2] + ... + a[n] = n*(n-1)/2。

其实上面的判别式就是兰道定理。

@accepted code@

#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
const int MAXN = 50000;
int a[MAXN + 5], n;
void solve() {
scanf("%d", &n);
for(int i=1;i<=n;i++)
scanf("%d", &a[i]);
sort(a + 1, a + n + 1);
ll sum = 0;
for(int i=1;i<=n;i++) {
sum += a[i];
if( sum < 1LL*i*(i-1)/2 ) {
puts("The data have been tampered with!");
return ;
}
}
if( sum == 1LL*n*(n-1)/2 )
puts("It seems to have no problem.");
else puts("The data have been tampered with!");
}
int main() {
int T; scanf("%d", &T);
while( T-- ) solve();
}

@details@

至于兰道定理真正的证明。。。没有必要记吧。。。记忆一个 hall 定理已经够累了。。。

@hdu - 5503@ EarthCup的更多相关文章

  1. HDOJ 2111. Saving HDU 贪心 结构体排序

    Saving HDU Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  2. 【HDU 3037】Saving Beans Lucas定理模板

    http://acm.hdu.edu.cn/showproblem.php?pid=3037 Lucas定理模板. 现在才写,noip滚粗前兆QAQ #include<cstdio> #i ...

  3. hdu 4859 海岸线 Bestcoder Round 1

    http://acm.hdu.edu.cn/showproblem.php?pid=4859 题目大意: 在一个矩形周围都是海,这个矩形中有陆地,深海和浅海.浅海是可以填成陆地的. 求最多有多少条方格 ...

  4. HDU 4569 Special equations(取模)

    Special equations Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u S ...

  5. HDU 4006The kth great number(K大数 +小顶堆)

    The kth great number Time Limit:1000MS     Memory Limit:65768KB     64bit IO Format:%I64d & %I64 ...

  6. HDU 1796How many integers can you find(容斥原理)

    How many integers can you find Time Limit:5000MS     Memory Limit:32768KB     64bit IO Format:%I64d ...

  7. hdu 4481 Time travel(高斯求期望)(转)

    (转)http://blog.csdn.net/u013081425/article/details/39240021 http://acm.hdu.edu.cn/showproblem.php?pi ...

  8. HDU 3791二叉搜索树解题(解题报告)

    1.题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=3791 2.参考解题 http://blog.csdn.net/u013447865/articl ...

  9. hdu 4329

    problem:http://acm.hdu.edu.cn/showproblem.php?pid=4329 题意:模拟  a.     p(r)=   R'/i   rel(r)=(1||0)  R ...

随机推荐

  1. deque简单解析

    deque是支持双端插入删除的容器,oi中用来维护单调队列 声明方式 deque<int> d1;//声明一个叫d1的双向队列 deque<int> d2(d1);//声明一个 ...

  2. Vue--使用watch、computed、filter方法来监控

    watch与computed.filter: watch:监控已有属性,一旦属性发生了改变就去自动调用对应的方法 computed:监控已有的属性,一旦属性的依赖发生了改变,就去自动调用对应的方法 f ...

  3. 如何成功安装旧版本火狐,成功安装firebug

    1.下载一个老版本火狐浏览器: 历史版本下载 2.下载安装完成后,立即在火狐浏览器的选项设置里面把自动更新关闭 3.手动安装firebug:最后搜到可以下载成功的地址:http://www.onlin ...

  4. ThInkPHP加密和解密cookie(登录操作)

    摘自:http://www.thinkphp.cn/code/1794.html 通过加密cookie是网站安全性更高,登录信息不保存在session中在function.php文件在建立两个函数,加 ...

  5. vs dump调试

    1. dump文件和pdb文件的匹配问题 >> 发布二进制文件时生成的pdb文件一定要保留,只有当发布的二进制文件和pdb文件是同时生成的才好正确调试. 2. dump文件和pdb文件放在 ...

  6. JavaScript--预解析在IE存在的问题

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  7. PHP学习(mysqli函数)

    php是一种运行在服务器端的程序语言,用于生产动态网页内容.特点:开源,简单,易上手,跨平台(windows,linux),占用资源少,尤其适合中小型应用开发.(微博,微信,论坛等等)一,搭建软件环境 ...

  8. R语言与显著性检验学习笔记

    R语言与显著性检验学习笔记 一.何为显著性检验 显著性检验的思想十分的简单,就是认为小概率事件不可能发生.虽然概率论中我们一直强调小概率事件必然发生,但显著性检验还是相信了小概率事件在我做的这一次检验 ...

  9. SQLserver与Mysql的区别

    参考链接:https://www.cnblogs.com/qingqing-919/p/8417773.html

  10. cocos2dx3.0项目创建流程

    cocos2dx3.0不是beta,新增了wp项目创建的支持 但不知道为啥非beta版本号的tools文件夹中取消了project-creator,可能有更改吧 没有这个工具还挺麻烦.就自己手动创建c ...