比赛
难度级别:D; 运行时间限制:2000ms; 运行空间限制:51200KB; 代码长度限制:2000000B
试题描述
初三年级举办了一场篮球赛,共有N个班级参加。当WZJ知道了这件事情, 已经打完了若干场比赛(WZJ一直在写Fenwich套Treap),接下来还要进行M场比赛。第i场比赛的竞争班级是ai,bi,胜者得2分,负者得0 分,若平局则两班各得1分。为了让得分尽量平均,现在给出每个班级已经得到的分数si,与接下来M场比赛的安排,请你回答得分最多的班级的得分最少是多 少。
输入
第一行为两个正整数N,M。
第二行为N个正整数si。
接下来M行每行两个正整数ai,bi。
输出
请你回答得分最多的班级的得分最少是多少。
输入示例
5 3
1 2 2 1 3
1 5
2 3
4 5
输出示例
3
其他说明
第一场比赛1赢
第二场比赛平局
第三场比赛4赢
则最后每个班级的得分都是3
1<=N<=1000
1<=M<=50000
1<=si<=100
1<=ai!=bi<=M

题解:赤裸裸的网络流建模。

首先看到破题口"得分最多的班级的得分最少是多少"先二分答案,将问题转化为"得分为point的方案是否可行"。怎么检查可行呢?(或者说怎么样才算可行)就是强制分配这么多的得分,如果每一场比赛都成功分配了两个队的分数我们就称之为"可行"(其实算是ISAP的处理流的办法:我们先模拟大量的流,不断地修正检查获得结果。以前我都不知道= =)。当然了,这么想是很辨证的,事实上一定会有其他的解法。

继续,我们怎么分配分数并检查呢?仔细阅读这道题的特殊性:每场比赛一定会贡献两个积分,于是我们就用流来模拟积分的流动转移,最后在汇点处用容量卡每个队能获取分数的最大值。易知当且仅当每场比赛都分配出了两个积分(即最大流是比赛数量的两倍时)这样的方案是合法的。

Ps二分图还是跑Dinic吧,ISAP快不了多少:

 #include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<queue>
#include<cstring>
using namespace std;
const int maxn=+,maxm=+,inf=-1u>>;
struct ISAP{
struct tedge{int x,y,w,next;}adj[maxm];int ms,fch[maxn];
int d[maxn],s[maxn],cur[maxn],gap[maxn],n,top;
void init(int n){
this->n=n;ms=;top=;
memset(d,-,sizeof(d));
memset(fch,-,sizeof(fch));
return;
}
void addedge(int u,int v,int w){
adj[ms]=(tedge){u,v,w,fch[u]};fch[u]=ms++;
adj[ms]=(tedge){v,u,,fch[v]};fch[v]=ms++;
return;
}
void bfs(){
queue<int>Q;Q.push(n);d[n]=;
while(!Q.empty()){
int u=Q.front();Q.pop();
for(int i=fch[u];i!=-;i=adj[i].next){
int v=adj[i].y;
if(d[v]==-) d[v]=d[u]+,Q.push(v);
}
} return;
}
int maxflow(int S,int T){
n=T;bfs();int k=S,i,flow=;
for(i=;i<=n;i++) cur[i]=fch[i],gap[d[i]]++;
while(d[S]<n){
if(k==n){
int mi=inf,pos;
for(i=;i<top;i++) if(adj[s[i]].w<mi) mi=adj[s[i]].w,pos=i;
for(i=;i<top;i++) adj[s[i]].w-=mi,adj[s[i]^].w+=mi;
flow+=mi;top=pos;k=adj[s[top]].x;
}
for(i=cur[k];i!=-;i=adj[i].next){
int v=adj[i].y;
if(adj[i].w&&d[k]==d[v]+){cur[k]=i;k=v;s[top++]=i;break;}
}
if(i==-){
int lim=n;
for(i=fch[k];i!=-;i=adj[i].next){
int v=adj[i].y;
if(adj[i].w&&d[v]<lim) lim=d[v],cur[k]=i;
} if(--gap[d[k]]==) break;
d[k]=lim+;gap[d[k]]++;
if(k!=S) k=adj[s[--top]].x;
}
} return flow;
}
}sol;
inline int read(){
int x=,sig=;char ch=getchar();
while(!isdigit(ch)){if(ch=='-') sig=-;ch=getchar();}
while(isdigit(ch)) x=*x+ch-'',ch=getchar();
return x*=sig;
}
inline void write(int x){
if(x==){putchar('');return;}if(x<) putchar('-'),x=-x;
int len=,buf[];while(x) buf[len++]=x%,x/=;
for(int i=len-;i>=;i--) putchar(buf[i]+'');return;
}
int n,m,a[maxn],b[maxn],p[maxn];
bool check(int point){
sol.init(n+m+);
int S=n+m+,T=n+m+;
for(int i=;i<=m;i++){
sol.addedge(S,i,);
sol.addedge(i,a[i]+m,inf);
sol.addedge(i,b[i]+m,inf);
}
for(int i=;i<=n;i++) sol.addedge(i+m,T,point-p[i]);
return sol.maxflow(S,T)==m<<;
}
void init(){
int L=,R=;n=read();m=read();
for(int i=;i<=n;i++) p[i]=read(),L=max(L,p[i]);
for(int i=;i<=m;i++) a[i]=read(),b[i]=read();
R=L+(m<<);
while(L<R){
int M=L+R>>;
if(check(M)) R=M;
else L=M+;
}
write(L);
return;
}
void work(){
return;
}
void print(){
return;
}
int main(){
init();work();print();return ;
}

搜索

复制

COJ 0503 比赛的更多相关文章

  1. Livecoding.tv 现正举行iOS及Android App设计比赛

    近日,Livecoding.tv, 一个为世界各地的程序员提供在线实时交流的平台,在其网站上发布了一篇通知, 宣布从4月15日至5月15日,会为iOS和Android的开发者举办一场本地移动app设计 ...

  2. 为什么我如此热爱这样一个比赛(转自vici)

    为什么我如此的热爱这样一个比赛呢?因为它总能带给我一个目标,让我去努力实现它.因为可以看到胜利的希望,于是不断的去追逐.虽然其中的过程可能是比较艰辛的.   对于天才选手,作为天生的冠军,大概凭借天赋 ...

  3. HDU(1285)—确定比赛名次

    /*最近都在复习期末了...好久没做题,都快没智商了*/   有N个比赛队(1<=N<=500),编号依次为1,2,3,....,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后 ...

  4. 白话贝叶斯理论及在足球比赛结果预测中的应用和C#实现

    离去年“马尔可夫链进行彩票预测”已经一年了,同时我也计划了一个彩票数据框架的搭建,分析和预测的框架,会在今年逐步发表,拟定了一个目录,大家有什么样的意见和和问题,可以看看,留言我会在后面的文章中逐步改 ...

  5. [BZOJ3139][HNOI2013] 比赛

    Description 沫沫非常喜欢看足球赛,但因为沉迷于射箭游戏,错过了最近的一次足球联赛.此次联 赛共N支球队参加,比赛规则如下:  (1) 每两支球队之间踢一场比赛. (2) 若平局,两支球队各 ...

  6. hduoj 1285 确定比赛名次

    http://acm.hdu.edu.cn/showproblem.php?pid=1285 确定比赛名次 Time Limit: 2000/1000 MS (Java/Others) Memory ...

  7. 排球比赛计分规则(P205页)

    排球比赛计分规则: 1.SPEC的目标是什么?SPEC的目标不包括什么? 为了让大家更加了解排球比赛. 2.SPEC用户和典型场景是什么? 用户:运动员,观众,教练 场景:排球赛场 3.SPEC用到哪 ...

  8. HDU 1285 确定比赛排名 (数组实现 )

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1285 确定比赛名次 Time Limit: 2000/1000 MS (Java/Others)    ...

  9. 确定比赛名次---HDU1285(拓扑排序)

    http://acm.hdu.edu.cn/showproblem.php?pid=1285 题目大意: 给你每场比赛的成绩,让你根据成绩把排名弄出来 分析: 本来我是用普通方法写的,然后就一直wa, ...

随机推荐

  1. "Storage Virtualization" VS "Software-Defined Storage"

    http://www.computerweekly.com/blogs/StorageBuzz/2013/07/storage-virtualisation-vs-soft.html 这篇blog的目 ...

  2. Codeforces Round #258 (Div. 2)[ABCD]

    Codeforces Round #258 (Div. 2)[ABCD] ACM 题目地址:Codeforces Round #258 (Div. 2) A - Game With Sticks 题意 ...

  3. 2015移动安全挑战赛(阿里&看雪主办)第一题分析

    今天在网上看到了阿里移动安全比赛的第一次,并且说难度不大,便拿来看了看. 主体就是找出一个密码输进去,然后看正误. 这个题是纯Java层的一个题,也没用进行什么保护.可以直接反编译. 登陆Button ...

  4. [转] linux系统文件流、文件描述符与进程间关系详解

    http://blog.sina.com.cn/s/blog_67b74aea01018ycx.html linux(unix)进程与文件的关系错综复杂,本教程试图详细的阐述这个问题. 包括:     ...

  5. 深入探索C++对象模型-1

    概述 在实际生产中,遇到一个复杂的类,如果能看出这个类的内存模型结构,那么以后的操作基本就没有难度的: 所以说,学会分析一个类的内存模型,是每一个C++程序员必须要会的知识. 下面,就让我们来了解C+ ...

  6. python面对对象编程----------7:callable(类调用)与context(上下文)

    一:callables callables使类实例能够像函数一样被调用 如果类需要一个函数型接口这时用callable,最好继承自abc.Callable,这样有些检查机制并且一看就知道此类的目的是c ...

  7. Java编程思想-基于注解的单元测试

    Junit的测试方法命名不一定以test开头 上面介绍的atunit已经很老了,现在junit测试框架已经基本注解了

  8. 表达式:使用API创建表达式树(1)

    表达式树可使用Expressions类的静态工厂方法来创建.这种用API的方式创建给予我们在编程极大的灵活性,MSDN上关于表达式的例子也不少,但在使用过程中还是会遇到许多麻烦,对有的表达式类,介绍得 ...

  9. 99%Bug 修复方法

    以下仅支持4.0.3或之后的设备 (写在前面,这个教程需要安装两个app,且卸载后无法达到效果,所以有app drawer洁癖者慎重(你可以把它们隐藏起来么). 当然等官方rom更新或者安装最新三方r ...

  10. Linux下修改键盘默认布局

    有时候在安装Linux选择键盘到布局到时候,会选择错误,这个时候可以选择终端命令来进行重新选择 sudo dpkg-reconfigure keyboard-configuration 之后键盘文我选 ...