【BZOJ1449】 球队收益
时间:2019-03-20
本文章向大家介绍【BZOJ1449】 球队收益,主要包括【BZOJ1449】 球队收益使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
BZOJ1449 球队收益
Output
一个整数表示联盟里所有球队收益之和的最小值。
Sample Input
3 3
1 0 2 1
1 1 10 1
0 1 3 3
1 2
2 3
3 1
Sample Output
43
我们先假设所有的球队都赢,算出答案。然后每场比赛都要提供一个输的场次。
考虑费用流。源点向每场比赛连边,每场比赛向两只队伍连边,队伍再向汇点连边。
注意到一只队伍的得分是关于输的场次的一个二次函数,所以每增加一个输场,增加或减少的收益不一样。所以我们拆边。设\(f_{i,k}\)表示第\(i\)只队伍输\(k\)场的收益,则第\(a\)条边的权值为\(f_{i,a}-f_{i,a-1}\)。然后再跑最小费用流。
因为这是个开口向上的二次函数,它的二阶导是大于\(0\)的。 所以\(f_{i,a}-f_{i,a-1}\)单调递增,这么拆边是对的。
代码:
#include<bits/stdc++.h>
#define ll long long
#define N 15005
using namespace std;
inline int Get() {int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9') {if(ch=='-') f=-1;ch=getchar();}while('0'<=ch&&ch<='9') {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}return x*f;}
int n,m;
int S,T;
int win[N],lose[N];
int c[N],d[N];
int a[N],b[N];
struct road {
int to,next;
int f,c;
}s[N<<4];
int h[N<<2],cnt=1;
void add(int i,int j,int f,int c) {
s[++cnt]=(road) {j,h[i],f,c};h[i]=cnt;
s[++cnt]=(road) {i,h[j],0,-c};h[j]=cnt;
}
int tim[N];
ll ans;
ll dis[N];
queue<int>q;
int fr[N],e[N];
bool in[N];
bool spfa(int S) {
memset(dis,0x3f,sizeof(dis));
dis[S]=0;
q.push(S);
while(!q.empty()) {
int v=q.front();q.pop();
in[v]=0;
for(int i=h[v];i;i=s[i].next) {
int to=s[i].to;
if(s[i].f&&dis[to]>dis[v]+s[i].c) {
dis[to]=dis[v]+s[i].c;
fr[to]=v;
e[to]=i;
if(!in[to]) {
in[to]=1;
q.push(to);
}
}
}
}
if(dis[T]>1e9) return 0;
ans+=dis[T];
for(int i=T;i;i=fr[i]) {
s[e[i]].f--;
s[e[i]^1].f++;
}
return 1;
}
int main() {
n=Get(),m=Get();
for(int i=1;i<=n;i++) {
win[i]=Get(),lose[i]=Get();
c[i]=Get(),d[i]=Get();
}
T=m+n+1;
for(int i=1;i<=m;i++) {
a[i]=Get(),b[i]=Get();
add(S,i,1,0);
tim[a[i]]++,tim[b[i]]++;
add(i,a[i]+m,1,0),add(i,b[i]+m,1,0);
}
for(int i=1;i<=n;i++) {
ll last=1ll*c[i]*(win[i]+tim[i])*(win[i]+tim[i])+1ll*d[i]*lose[i]*lose[i],now;
ans+=last;
for(int j=1;j<=tim[i];j++) {
now=1ll*c[i]*(win[i]+tim[i]-j)*(win[i]+tim[i]-j)+1ll*d[i]*(lose[i]+j)*(lose[i]+j);
add(i+m,T,1,now-last);
last=now;
}
}
while(spfa(S));
cout<<ans;
return 0;
}
- 200行,写个2048游戏
- 您有一份CTF代码审计文件等待查收
- 颠覆者的游戏:程序语言
- CTF| SQL注入之login界面
- 懒惰的力量
- 让AI自动修复程序中的bug:微软亚洲研究院新研究 | 附论文
- OpenDaylight与Mininet应用实战之OpenFlow1.0协议分析二
- Javascript: 世纪机器语言?
- OpenDaylight与Mininet应用实战之基本环境搭建一
- 永恒不变的魅力
- MobileNet教程(2):用TensorFlow搭建安卓手机上的图像分类App
- OpenDaylight与Mininet应用实战之流表操作三
- 天啊,这个围笑代表什么?麻省理工的AI比你更懂 | 论文+Demo
- elixir:灵丹妙药?or 徒有其名?
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法