【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;
}
【BZOJ1449】 球队收益的更多相关文章
- 【BZOJ1449】[JSOI2009]球队收益(网络流,费用流)
[BZOJ1449][JSOI2009]球队收益(网络流,费用流) 题面 BZOJ 洛谷 题解 首先对于一支队伍而言,总共进行多少场比赛显然是已知的,假设是\(n_i\)场,那么它的贡献是:\(C_i ...
- Bzoj1449 [JSOI2009]球队收益
Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 741 Solved: 423 Description Input Output 一个整数表示联盟里所有球 ...
- 【BZOJ-1449&2895】球队收益&球队预算 最小费用最大流
1449: [JSOI2009]球队收益 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 648 Solved: 364[Submit][Status][ ...
- BZOJ1449[JSOI2009]球队收益&BZOJ2895球队预算——最小费用最大流
题目描述 输入 输出 一个整数表示联盟里所有球队收益之和的最小值. 样例输入 3 3 1 0 2 1 1 1 10 1 0 1 3 3 1 2 2 3 3 1 样例输出 43 提示 要求总费用最低 ...
- 【bzoj1449/bzoj2895】[JSOI2009]球队收益/球队预算 费用流
题目描述 输入 输出 一个整数表示联盟里所有球队收益之和的最小值. 样例输入 3 3 1 0 2 1 1 1 10 1 0 1 3 3 1 2 2 3 3 1 样例输出 43 题解 费用流 由于存在一 ...
- 【BZOJ】【1449】【JSOI2009】球队收益
网络流/费用流/二分图最小权匹配 题解:http://blog.csdn.net/huzecong/article/details/9119741 太神了!由于一赢一输不好建图,就先假设全部都输,再将 ...
- bzoj 1449 [JSOI2009]球队收益(费用拆分,最小费用流)
1449: [JSOI2009]球队收益 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 547 Solved: 302[Submit][Status][ ...
- BZOJ 1449: [JSOI2009]球队收益( 最小费用最大流)
先考虑假如全部输了的收益. 再考虑每场比赛球队赢了所得收益的增加量,用这个来建图.. --------------------------------------------------------- ...
- 【BZOJ 1449】 1449: [JSOI2009]球队收益 (最小费用流)
1449: [JSOI2009]球队收益 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 841 Solved: 483 Description Inpu ...
随机推荐
- 编译部署mysql5.7.13
署环境centos7.2+mysql5.7.131.依赖包注: 相关依赖包的作用cmake:由于从 MySQL5.5 版本开始弃用了常规的 configure 编译方法,所以需要 CMake 编译器, ...
- C#基础知识回顾:1.由WeakReference想到对象的创建与销毁
.Net Framework中,把资源分为托管资源和非托管资源两大类, 托管资源指可以通过.Net Frame垃圾回收器进行回收的资源,主要是指分配在托管堆上你的内存资源,这类资源的回收是不需要人工干 ...
- js控制随机数生成概率代码实例
基本思路:把Math.random()js随机数生成的数看着百分比,然后定义每个整数值取值范围. 具体内容如下,供大家参考 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ...
- C#DataTable复制、C#DataTable列复制、C#DataTable字段复制
try { //获取满足条件的数据 DataTable Mdr = datable.Select().ToString("yyyy-MM-dd HH:mm:ss") + " ...
- angularjs-select2的使用
1.引入文件 '/select2.css', '/select2-bootstrap.css', '/select2.min.js', ‘/angular-select2.min.js’ 2.页面 3 ...
- IP 协议
在网络层中,使用的是 ip 协议,它规定网络地址的协议. ip 地址分为两个部分: 网络部分:标识子网 主机部分:标识主机 子网掩码 表示子网络特征的一个参数,它规定 网络部分全部为1,主机部分全部为 ...
- 洛谷P4104 [HEOI2014]平衡(dp 组合数学)
题意 题目链接 Sol 可以把题目转化为从\([1, 2n + 1]\)中选\(k\)个数,使其和为\((n+1)k\). 再转化一下:把\((n+1)k\)划分为\(k\)个数,满足每个数在范围在\ ...
- Java多线程面试题整理
部分一:多线程部分: 1) 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务提速. ...
- wap2app(二)-- 设置APP系统状态栏
准备 工具:HBuilder 一.全屏设置,不显示系统状态栏 这里所说的系统状态栏就是包括了:信号.运营商.电量等信息手机屏幕最顶部信息. 全屏并非状态栏透明或变色,而是没有状态栏,也就是看不见电量. ...
- 兼容性问题:backgroud-size支持IE8浏览器的方法
在工作中碰到一个问题:background-size是css3的新属性,当在IE8及其以下浏览器中不起作用,导致背景图片不能自适应元素的大小? 先看一个小demo: <!DOCTYPE html ...