题意

\(n\)个人\(m\)场比赛\((1 \le n \le 10000, 0 \le m \le 10000)\),给出每场比赛的两个选手,求赢得最多的人最少赢的场数。

分析

二分最多人赢的场数,那么我们就得到了所有人赢的场次的上界。所以我们可以考虑网络流模型。

题解

对于二分的值\(d\),我们建\(m\)个点表示比赛,\(n\)个点表示人。对于每场比赛\(i\),连边\((s, i)\),上界为\(1\),连边\((i, u_i), (i, v_i)\),上界为\(1\)。对于每个人\(i\),连边\((i, t)\),上界为\(d\)。然后判断最大流是否是\(m\)即可。

然而这题卡isap,所以用dinic来做到单次最大流\(O((m+n)\sqrt{n})\)。(然而isap用一些奇葩的减枝也能过。

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. inline int getint() {
  4. int x=0;
  5. char c=getchar();
  6. for(; c<'0'||c>'9'; c=getchar());
  7. for(; c>='0'&&c<='9'; x=x*10+c-'0', c=getchar());
  8. return x;
  9. }
  10. const int vN=20015, N=10015, oo=~0u>>1;
  11. int ihead[vN], cnt=1, win[N], X[N], Y[N];
  12. struct E {
  13. int next, to, cap;
  14. }e[vN<<3];
  15. void add(int x, int y) {
  16. e[++cnt]=(E){ihead[x], y, 0}; ihead[x]=cnt;
  17. e[++cnt]=(E){ihead[y], x, 0}; ihead[y]=cnt;
  18. }
  19. int isap(int s, int t, int n) {
  20. static int gap[vN], cur[vN], d[vN], p[vN];
  21. memset(d, 0, sizeof(int)*(n+1));
  22. memset(cur, 0, sizeof(int)*(n+1));
  23. memset(gap, 0, sizeof(int)*(n+1));
  24. gap[0]=n;
  25. int r=0;
  26. for(int x=s, f, i; d[s]<n && d[s]<100;) {
  27. for(i=cur[x]; i && !(e[i].cap && d[x]==d[e[i].to]+1); i=e[i].next);
  28. if(i) {
  29. p[e[i].to]=cur[x]=i;
  30. if((x=e[i].to)==t) {
  31. for(f=oo, x=t; x!=s; f=min(f, e[p[x]].cap), x=e[p[x]^1].to);
  32. for(r+=f, x=t; x!=s; e[p[x]].cap-=f, e[p[x]^1].cap+=f, x=e[p[x]^1].to);
  33. }
  34. }
  35. else {
  36. if(!--gap[d[x]]) {
  37. break;
  38. }
  39. d[x]=n;
  40. for(i=ihead[x]; i; i=e[i].next) {
  41. if(e[i].cap && d[x]>d[e[i].to]+1) {
  42. d[x]=d[e[i].to]+1;
  43. cur[x]=i;
  44. }
  45. }
  46. ++gap[d[x]];
  47. if(x!=s) {
  48. x=e[p[x]^1].to;
  49. }
  50. }
  51. }
  52. return r;
  53. }
  54. int n, m, s, t;
  55. bool check(int mid) {
  56. static int rest[N], match[N];
  57. fill(rest+1, rest+1+n, mid);
  58. int need=0;
  59. for(int i=1; i<=m; ++i) {
  60. int x=X[i], y=Y[i];
  61. if(rest[x]<rest[y]) {
  62. swap(x, y);
  63. }
  64. if(!rest[x]) {
  65. ++need;
  66. match[i]=0;
  67. }
  68. else {
  69. match[i]=x;
  70. --rest[x];
  71. }
  72. }
  73. if(!need) {
  74. return 1;
  75. }
  76. int ct=1;
  77. for(int i=1; i<=m; ++i) {
  78. if(!match[i]) {
  79. e[++ct].cap=1, e[++ct].cap=0;
  80. e[++ct].cap=1, e[++ct].cap=0;
  81. e[++ct].cap=1, e[++ct].cap=0;
  82. }
  83. else {
  84. e[++ct].cap=0, e[++ct].cap=1;
  85. if(X[i]==match[i]) {
  86. e[++ct].cap=0, e[++ct].cap=1;
  87. e[++ct].cap=1, e[++ct].cap=0;
  88. }
  89. else {
  90. e[++ct].cap=1, e[++ct].cap=0;
  91. e[++ct].cap=0, e[++ct].cap=1;
  92. }
  93. }
  94. }
  95. for(int i=1; i<=n; ++i) {
  96. e[++ct].cap=rest[i], e[++ct].cap=mid-rest[i];
  97. }
  98. return isap(s, t, t)==need;
  99. }
  100. int main() {
  101. n=getint(), m=getint(), s=m+n+1, t=s+1;
  102. for(int i=1; i<=m; ++i) {
  103. int x=X[i]=getint(), y=Y[i]=getint();
  104. add(s, i);
  105. add(i, m+x);
  106. add(i, m+y);
  107. if(win[x]>win[y]) {
  108. swap(x, y);
  109. }
  110. ++win[x];
  111. }
  112. int l=0, r=0;
  113. for(int i=1; i<=n; ++i) {
  114. add(m+i, t);
  115. r=max(r, win[i]);
  116. }
  117. while(l<=r) {
  118. int mid=(l+r)>>1;
  119. check(mid)?(r=mid-1):(l=mid+1);
  120. }
  121. printf("%d\n", r+1);
  122. return 0;
  123. }

【BZOJ】1532: [POI2005]Kos-Dicing的更多相关文章

  1. 【BZOJ】1537: [POI2005]Aut- The Bus

    [算法]DP+线段树求区间max(二维偏序) [题解] 状态转移方程:f[i]=max(f[j]+v[i]),x[j]<x[i]&&y[j]<y[i]. 观察j的条件限制显 ...

  2. 【BZOJ】1529 [POI2005]ska Piggy banks

    [算法](强连通分量)并查集 [题解] 1.用tarjan计算强连通分量并缩点,在新图中找入度为0的点的个数就是答案. 但是,会爆内存(题目内存限制64MB). 2.用并查集,最后从1到n统计fa[i ...

  3. 【BZOJ】1535: [POI2005]Sza-Template

    题意 给一个串\(s(1 \le |s| \le 500000)\),求一个最长的串,使得这个串能覆盖整个串(可以重叠). 分析 首先这个串肯定是前缀也肯定是后缀. 题解 对串kmp后,建立\(fai ...

  4. 【BZOJ】3052: [wc2013]糖果公园

    http://www.lydsy.com/JudgeOnline/problem.php?id=3052 题意:n个带颜色的点(m种),q次询问,每次询问x到y的路径上sum{w[次数]*v[颜色]} ...

  5. 【BZOJ】3319: 黑白树

    http://www.lydsy.com/JudgeOnline/problem.php?id=3319 题意:给一棵n节点的树(n<=1e6),m个操作(m<=1e6),每次操作有两种: ...

  6. 【BZOJ】3319: 黑白树(并查集+特殊的技巧/-树链剖分+线段树)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3319 以为是模板题就复习了下hld............................. 然后n ...

  7. 【BZOJ】1013: [JSOI2008]球形空间产生器sphere

    [BZOJ]1013: [JSOI2008]球形空间产生器sphere 题意:给n+1个n维的点的坐标,要你求出一个到这n+1个点距离相等的点的坐标: 思路:高斯消元即第i个点和第i+1个点处理出一个 ...

  8. 【BZOJ】1002:轮状病毒(基尔霍夫矩阵【附公式推导】或打表)

    Description 轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生的.一个N轮状基由圆环上N个不同的基原子和圆心处一个核原子构成的,2个原子之间的边表示这2个原子之间的信息通道.如下图 ...

  9. 【BZOJ】【3083】遥远的国度

    树链剖分/dfs序 其实过了[BZOJ][4034][HAOI2015]T2以后就好搞了…… 链修改+子树查询+换根 其实静态树的换根直接树链剖分就可以搞了…… 因为其实只有一样变了:子树 如果roo ...

随机推荐

  1. Android5.0如何正确启用isLoggable(二) 理分析

    转自:http://www.it165.net/pro/html/201506/43374.html 概要 在上文<Android 5.0 如何正确启用isLoggable(一)__使用详解&g ...

  2. poj 2524:Ubiquitous Religions(并查集,入门题)

    Ubiquitous Religions Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 23997   Accepted:  ...

  3. [Nodejs]十分钟快速编写简单静态文件服务器

    学了几天Nodejs 后我又干上了前端的活.这次遇到的问题是,我想在不同的设备上方便的查看我编写的网页,很自然的就想到要是能在本地搭建一个简单的http服务器的话,那局域网内的所有设备都可以访问了,这 ...

  4. Installing MySQL Server on CentOS

    MySQL is an open-source relational database. For those unfamiliar with these terms, a database is wh ...

  5. Win 10 开发中Adaptive磁贴模板的XML文档结构,Win10 应用开发中自适应Toast通知的XML文档结构

    分享两篇Win 10应用开发的XML文档结构:Win 10 开发中Adaptive磁贴模板的XML文档结构,Win10 应用开发中自适应Toast通知的XML文档结构. Win 10 开发中Adapt ...

  6. loj 1002(spfa变形)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=25828 题意:求所有点到给定的目标顶点的路径上的权值的最大值的最小 ...

  7. FreeMarker学习(宏<#macro>的使用)

    原文链接:https://my.oschina.net/weiweiblog/blog/506301?p=1 用户定义指令-使用@符合来调用  有两种不同的类型:Macro(宏)和transform( ...

  8. 生成n位随机字符串

    --1.借助newid() Go --创建视图(因为在函数中无法直接使用newid()) create view vnewid as select newid() N'MacoId'; go --创建 ...

  9. Sql Server 常用系统存储过程大全

    -- 来源于网络 -- 更详细的介结参考联机帮助文档 xp_cmdshell --*执行DOS各种命令,结果以文本行返回. xp_fixeddrives --*查询各磁盘/分区可用空间 xp_logi ...

  10. 【架构】MVP模型

    MVP模型一般要创建三个文件夹:View.Interactor(Model).Presenter 每个部分都有其接口和实现类,就是为了方便回调 这里做一个登陆界面为例子: 接口: Interactor ...