博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[hdu5503]EarthCup[霍尔定理]
阅读量:5148 次
发布时间:2019-06-13

本文共 1590 字,大约阅读时间需要 5 分钟。

题意

一共 \(n\) 只球队,两两之间会进行一场比赛,赢得一分输不得分,给出每只球队最后的得分,问能否构造每场比赛的输赢情况使得得分成立。多组数据

\(T\le 10,n\le 5\times 10^4\)

分析

  • 容易想到一个网络流的模型:把每场比赛看成点,连向对应的两只队伍。实际上可以把每只队伍的拆成 \(a_i\) 个点就是二分图的模型了。
  • 考虑霍尔定理,队伍和队伍之间的区别只在于 \(a\) ,所以考虑枚举队伍数量 \(k\) ,判断最极端的 \(k\) 只队伍即可。\(a\) 最小的 \(k\) 只队伍应满足: \(\frac{k(k-1)}{2}\le \sum\limits_{i=1}^ka_i\),所以排个序判断一下就好了。
  • 总时间复杂度 \(O(nlogn)\)

代码

#include
using namespace std;typedef long long LL;#define go(u) for(int i = head[u], v = e[i].to; i; i=e[i].lst, v=e[i].to)#define rep(i, a, b) for(int i = a; i <= b; ++i)#define pb push_back#define re(x) memset(x, 0, sizeof x)inline int gi() { int x = 0,f = 1; char ch = getchar(); while(!isdigit(ch)) { if(ch == '-') f = -1; ch = getchar();} while(isdigit(ch)) { x = (x << 3) + (x << 1) + ch - 48; ch = getchar();} return x * f;}template
inline void Max(T &a, T b){if(a < b) a = b;}template
inline void Min(T &a, T b){if(a > b) a = b;}const int N = 5e4 + 7;int n, T;int a[N];int main() { T = gi(); while(T--) { n = gi();bool fg = 1;LL tot = 0; rep(i, 1, n) a[i] = gi(), tot += a[i]; if(tot != 1ll * n * (n - 1) / 2) { puts("The data have been tampered with!"); continue; } sort(a + 1, a + 1 + n); LL sum = 0; rep(i, 1, n) { sum += a[i]; if(1ll * i * (i - 1) / 2 > sum) { fg = 0; break;} } if(!fg) puts("The data have been tampered with!"); else puts("It seems to have no problem."); } return 0;}

转载于:https://www.cnblogs.com/yqgAKIOI/p/10225326.html

你可能感兴趣的文章
treegrid.bootstrap使用说明
查看>>
[Docker]Docker拉取,上传镜像到Harbor仓库
查看>>
导航,头部,CSS基础
查看>>
[USACO 2017 Feb Gold] Tutorial
查看>>
gzip
查看>>
转负二进制(个人模版)
查看>>
LintCode-Backpack
查看>>
查询数据库锁
查看>>
我对于脚本程序的理解——百度轻应用有感
查看>>
面试时被问到的问题
查看>>
注解小结
查看>>
list control控件的一些操作
查看>>
一月流水账
查看>>
判断字符串在字符串中
查看>>
Linux环境下Redis安装和常见问题的解决
查看>>
HashPump用法
查看>>
cuda基础
查看>>
Vue安装准备工作
查看>>
oracle 创建暂时表
查看>>
201421410014蒋佳奇
查看>>