【BZOJ】1532: [POI2005]Kos-Dicing
题意
\(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用一些奇葩的减枝也能过。
#include <bits/stdc++.h>
using namespace std;
inline int getint() {
int x=0;
char c=getchar();
for(; c<'0'||c>'9'; c=getchar());
for(; c>='0'&&c<='9'; x=x*10+c-'0', c=getchar());
return x;
}
const int vN=20015, N=10015, oo=~0u>>1;
int ihead[vN], cnt=1, win[N], X[N], Y[N];
struct E {
int next, to, cap;
}e[vN<<3];
void add(int x, int y) {
e[++cnt]=(E){ihead[x], y, 0}; ihead[x]=cnt;
e[++cnt]=(E){ihead[y], x, 0}; ihead[y]=cnt;
}
int isap(int s, int t, int n) {
static int gap[vN], cur[vN], d[vN], p[vN];
memset(d, 0, sizeof(int)*(n+1));
memset(cur, 0, sizeof(int)*(n+1));
memset(gap, 0, sizeof(int)*(n+1));
gap[0]=n;
int r=0;
for(int x=s, f, i; d[s]<n && d[s]<100;) {
for(i=cur[x]; i && !(e[i].cap && d[x]==d[e[i].to]+1); i=e[i].next);
if(i) {
p[e[i].to]=cur[x]=i;
if((x=e[i].to)==t) {
for(f=oo, x=t; x!=s; f=min(f, e[p[x]].cap), x=e[p[x]^1].to);
for(r+=f, x=t; x!=s; e[p[x]].cap-=f, e[p[x]^1].cap+=f, x=e[p[x]^1].to);
}
}
else {
if(!--gap[d[x]]) {
break;
}
d[x]=n;
for(i=ihead[x]; i; i=e[i].next) {
if(e[i].cap && d[x]>d[e[i].to]+1) {
d[x]=d[e[i].to]+1;
cur[x]=i;
}
}
++gap[d[x]];
if(x!=s) {
x=e[p[x]^1].to;
}
}
}
return r;
}
int n, m, s, t;
bool check(int mid) {
static int rest[N], match[N];
fill(rest+1, rest+1+n, mid);
int need=0;
for(int i=1; i<=m; ++i) {
int x=X[i], y=Y[i];
if(rest[x]<rest[y]) {
swap(x, y);
}
if(!rest[x]) {
++need;
match[i]=0;
}
else {
match[i]=x;
--rest[x];
}
}
if(!need) {
return 1;
}
int ct=1;
for(int i=1; i<=m; ++i) {
if(!match[i]) {
e[++ct].cap=1, e[++ct].cap=0;
e[++ct].cap=1, e[++ct].cap=0;
e[++ct].cap=1, e[++ct].cap=0;
}
else {
e[++ct].cap=0, e[++ct].cap=1;
if(X[i]==match[i]) {
e[++ct].cap=0, e[++ct].cap=1;
e[++ct].cap=1, e[++ct].cap=0;
}
else {
e[++ct].cap=1, e[++ct].cap=0;
e[++ct].cap=0, e[++ct].cap=1;
}
}
}
for(int i=1; i<=n; ++i) {
e[++ct].cap=rest[i], e[++ct].cap=mid-rest[i];
}
return isap(s, t, t)==need;
}
int main() {
n=getint(), m=getint(), s=m+n+1, t=s+1;
for(int i=1; i<=m; ++i) {
int x=X[i]=getint(), y=Y[i]=getint();
add(s, i);
add(i, m+x);
add(i, m+y);
if(win[x]>win[y]) {
swap(x, y);
}
++win[x];
}
int l=0, r=0;
for(int i=1; i<=n; ++i) {
add(m+i, t);
r=max(r, win[i]);
}
while(l<=r) {
int mid=(l+r)>>1;
check(mid)?(r=mid-1):(l=mid+1);
}
printf("%d\n", r+1);
return 0;
}
【BZOJ】1532: [POI2005]Kos-Dicing的更多相关文章
- 【BZOJ】1537: [POI2005]Aut- The Bus
[算法]DP+线段树求区间max(二维偏序) [题解] 状态转移方程:f[i]=max(f[j]+v[i]),x[j]<x[i]&&y[j]<y[i]. 观察j的条件限制显 ...
- 【BZOJ】1529 [POI2005]ska Piggy banks
[算法](强连通分量)并查集 [题解] 1.用tarjan计算强连通分量并缩点,在新图中找入度为0的点的个数就是答案. 但是,会爆内存(题目内存限制64MB). 2.用并查集,最后从1到n统计fa[i ...
- 【BZOJ】1535: [POI2005]Sza-Template
题意 给一个串\(s(1 \le |s| \le 500000)\),求一个最长的串,使得这个串能覆盖整个串(可以重叠). 分析 首先这个串肯定是前缀也肯定是后缀. 题解 对串kmp后,建立\(fai ...
- 【BZOJ】3052: [wc2013]糖果公园
http://www.lydsy.com/JudgeOnline/problem.php?id=3052 题意:n个带颜色的点(m种),q次询问,每次询问x到y的路径上sum{w[次数]*v[颜色]} ...
- 【BZOJ】3319: 黑白树
http://www.lydsy.com/JudgeOnline/problem.php?id=3319 题意:给一棵n节点的树(n<=1e6),m个操作(m<=1e6),每次操作有两种: ...
- 【BZOJ】3319: 黑白树(并查集+特殊的技巧/-树链剖分+线段树)
http://www.lydsy.com/JudgeOnline/problem.php?id=3319 以为是模板题就复习了下hld............................. 然后n ...
- 【BZOJ】1013: [JSOI2008]球形空间产生器sphere
[BZOJ]1013: [JSOI2008]球形空间产生器sphere 题意:给n+1个n维的点的坐标,要你求出一个到这n+1个点距离相等的点的坐标: 思路:高斯消元即第i个点和第i+1个点处理出一个 ...
- 【BZOJ】1002:轮状病毒(基尔霍夫矩阵【附公式推导】或打表)
Description 轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生的.一个N轮状基由圆环上N个不同的基原子和圆心处一个核原子构成的,2个原子之间的边表示这2个原子之间的信息通道.如下图 ...
- 【BZOJ】【3083】遥远的国度
树链剖分/dfs序 其实过了[BZOJ][4034][HAOI2015]T2以后就好搞了…… 链修改+子树查询+换根 其实静态树的换根直接树链剖分就可以搞了…… 因为其实只有一样变了:子树 如果roo ...
随机推荐
- 重温WCF之WCF传输安全(十三)(4)基于SSL的WCF对客户端采用证书验证(转)
转载地址:http://www.cnblogs.com/lxblog/archive/2012/09/20/2695397.html 前一篇我们演示了基于SSL的WCF 对客户端进行用户名和密码方式的 ...
- 南阳理工 题目9:posters(离散化+线段树)
posters 时间限制:1000 ms | 内存限制:65535 KB 难度:6 描述 The citizens of Bytetown, AB, could not stand that ...
- 2014百度之星资格赛 1004:Labyrinth(DP)
Labyrinth Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- phpMailer在thinkPHP框架中邮件发送
资源下载地址:http://pan.baidu.com/s/1c0kAoeO 提取码:ry5v 关键代码:application/Common/Common/funciton.php <?php ...
- PMP 第十章 项目沟通管理
1识别干系人 2规划沟通 3发布信息 4管理干系人期望 5报告绩效 1.沟通的维度有哪些?沟通技巧有哪些? 2.规划沟通管理的目的是什么?沟通渠道的计算(重点).影响沟通技术的因素有哪些?沟通模型的步 ...
- Effective C++ 之 Item 3:尽可能使用 const
Effective C++ Chapter 1. 让自己习惯C++(Accustoming Yourself to C++) Item 3. 尽可能使用 const (Use const whenev ...
- [Unity3d插件]EasyTouch的初步使用
对于移动平台上的RPG类的游戏,我们常用虚拟摇杆来控制人物角色的行走和一些行为,相信我们对它并不陌生,之前尝试了EasyTouch2.5,发现并没有最新版的3.1好用,2.5版本的对于自适应没有做的很 ...
- 2015最新移动App设计尺寸视觉规范【图文版】(转)
如今手机app的屏幕设计尺寸参差不齐,仿佛来到了移动界面尺寸战国时代,每家移动设备制造公司都为了迎合大众的口味,各家都在2014年大放光彩.2015年也将会是我们移动APP设计界快速发展的一年. 因为 ...
- 使用python做科学计算
这里总结一个guide,主要针对刚开始做数据挖掘和数据分析的同学 说道统计分析工具你一定想到像excel,spss,sas,matlab以及R语言.R语言是这里面比较火的,它的强项是强大的绘图功能以及 ...
- selenium实战-自动退百度云共享群
必备知识 在官网上下好selenium-3.0.1-py2.py3-none-any.whl,然后进入下载文件所在的位置 pip install selenium-3.0.1-py2.py3-none ...