题面

luogu

题解

最小费用最大流

先假设剩下\(m\)场比赛,双方全输。

考虑\(i\)赢一局的贡献

\(C_i*(a_i+1)^2+D_i*(b_i-1)^2-C_i*a_i^2-D_i*b_i^2\)

\(=C _i+2*a_i*C_i+D_i-2*b_i*D_i\)

建\(m\)个点限制每场比赛只有一个人赢,自\(S\)连一条\((1, 0)\)的边

然后从这\(m\)的点连向和比赛有关的两个点一条\((1, 0)\)的边

考虑关于\(t\)的边

因为\(a_i\)和\(b_i\)会变,不能直接连一条边

然后我们观察一下上面那个式子,

显然,赢得更多,贡献就增长越大

那么,拆边,我们可以对于每个点连向\(t\)很多条边,容量为\(1\),价值是赢了对应场数的贡献

贪心地想,因为赢得更多,贡献增长越大,要最小费用,我们会先走赢得少的边

这样累加答案刚好满足条件呢

Code

#include<bits/stdc++.h>

#define LL long long
#define RG register using namespace std;
template<class T> inline void read(T &x) {
x = 0; RG char c = getchar(); bool f = 0;
while (c != '-' && (c < '0' || c > '9')) c = getchar(); if (c == '-') c = getchar(), f = 1;
while (c >= '0' && c <= '9') x = x*10+c-48, c = getchar();
x = f ? -x : x;
return ;
}
template<class T> inline void write(T x) {
if (!x) {putchar(48);return ;}
if (x < 0) x = -x, putchar('-');
int len = -1, z[20]; while (x > 0) z[++len] = x%10, x /= 10;
for (RG int i = len; i >= 0; i--) putchar(z[i]+48);return ;
} const int N = 10000, inf = 2147483647; struct node {
int to, nxt, w, v;
}g[200*N];
int last[N], gl = 1;
void add(int x, int y, int w, int v) {
g[++gl] = (node) {y, last[x], w, v};
last[x] = gl;
g[++gl] = (node) {x, last[y], 0, -v};
last[y] = gl;
} queue<int> q;
int pre[N], dis[N], from[N], s, t;
bool vis[N]; bool spfa() {
memset(dis, 127, sizeof(dis));
dis[s] = 0;
q.push(s);
while (!q.empty()) {
int u = q.front(); q.pop();
for (int i = last[u]; i; i = g[i].nxt) {
int v = g[i].to;
if (g[i].w && dis[v] > dis[u] + g[i].v) {
dis[v] = dis[u] + g[i].v; pre[v] = u; from[v] = i;
if (!vis[v]) {
vis[v] = 1;
q.push(v);
}
}
}
vis[u] = 0;
}
return dis[t] != dis[0];
} int Mcmf() {
int ans = 0;
while (spfa()) {
int di = inf;
for (int i = t; i != s; i = pre[i]) di = min(di, g[from[i]].w);
ans += di*dis[t];
for (int i = t; i != s; i = pre[i]) g[from[i]].w -= di, g[from[i]^1].w += di;
}
return ans;
}
int a[N], b[N], c[N], d[N], cnt[N]; int main() {
int n, m, sum = 0;
read(n), read(m);
s = m+n+1, t = s+1;
for (int i = 1; i <= n; i++)
read(a[i]), read(b[i]), read(c[i]), read(d[i]);
for (int i = 1; i <= m; i++) {
int x, y;
read(x), read(y);
b[x]++, b[y]++;
cnt[x]++; cnt[y]++;
add(s, i, 1, 0);
add(i, x+m, 1, 0);
add(i, y+m, 1, 0);
}
for (int i = 1; i <= n; i++)
sum += c[i]*a[i]*a[i] + d[i]*b[i]*b[i];
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= cnt[i]; j++) {
add(i+m, t, 1, c[i]+2*a[i]*c[i]+d[i]-2*b[i]*d[i]);
b[i]--; a[i]++;
}
}
printf("%d\n", sum+Mcmf());
return 0;
}

洛谷 P4307 [JSOI2009]球队收益 / 球队预算(最小费用最大流)的更多相关文章

  1. 洛谷 P4009 汽车加油行驶问题 【最小费用最大流】

    分层图,建k层,设(i,j,0)为点(i,j)的满油状态,全图的流量都是1,因为重复走到一个点没有意义.如果当前点是加油站,那么它向它上左的点连费用为a的边,向下右连费用为a+b的边: 否则,这个点的 ...

  2. BZOJ1449[JSOI2009]球队收益&BZOJ2895球队预算——最小费用最大流

    题目描述 输入 输出 一个整数表示联盟里所有球队收益之和的最小值. 样例输入 3 3 1 0 2 1 1 1 10 1 0 1 3 3 1 2 2 3 3 1 样例输出 43 提示   要求总费用最低 ...

  3. 【BZOJ1449/2895】[JSOI2009]球队收益/球队预算 最小费用最大流

    [BZOJ2895]球队预算 Description 在一个篮球联赛里,有n支球队,球队的支出是和他们的胜负场次有关系的,具体来说,第i支球队的赛季总支出是Ci*x^2+Di*y^2,Di<=C ...

  4. 【BZOJ-1449&2895】球队收益&球队预算 最小费用最大流

    1449: [JSOI2009]球队收益 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 648  Solved: 364[Submit][Status][ ...

  5. 洛谷P4307 球队收益

    题意:有n个球队,m场比赛. 每个球队都已经有些胜负场次了. 每个球队的收益为Ci * wini2 - Di * losei2. 求最小可能总收益. 解: 先看出一个模型:用一流量代表一个胜场,每场比 ...

  6. 【bzoj1449/bzoj2895】[JSOI2009]球队收益/球队预算 费用流

    题目描述 输入 输出 一个整数表示联盟里所有球队收益之和的最小值. 样例输入 3 3 1 0 2 1 1 1 10 1 0 1 3 3 1 2 2 3 3 1 样例输出 43 题解 费用流 由于存在一 ...

  7. 【BZOJ1449】[JSOI2009]球队收益(网络流,费用流)

    [BZOJ1449][JSOI2009]球队收益(网络流,费用流) 题面 BZOJ 洛谷 题解 首先对于一支队伍而言,总共进行多少场比赛显然是已知的,假设是\(n_i\)场,那么它的贡献是:\(C_i ...

  8. 【洛谷2469/BZOJ1927】[SDOI2010]星际竞速(费用流/最小路径覆盖)

    题目: 洛谷2469 分析: 把题目翻译成人话:给一个带边权的DAG,求一个路径覆盖方案使路径边权总和最小.从点\(i\)开始的路径需要额外加上\(A_i\)的权值. 回xian忆chang一xue下 ...

  9. BZOJ 1449: [JSOI2009]球队收益( 最小费用最大流)

    先考虑假如全部输了的收益. 再考虑每场比赛球队赢了所得收益的增加量,用这个来建图.. --------------------------------------------------------- ...

随机推荐

  1. STL扩展容器

    string | array | hash 1. string - 可以视为以字符为元素的一种容器, 可以在字符上进行遍历, 提供begin()/end() - 为了支持迭代器和迭代器适配器 , st ...

  2. .NET开源MSSQL、Redis监控产品Opserver之MSSQL配置

    MSSQL的配置比较简单,主要包括三部分: 默认配置(defaultConnectionString).集群配置(clusters).单实例配置(instances) defaultConnectio ...

  3. 回归(regression)、梯度下降(gradient descent)

    本文由LeftNotEasy所有,发布于http://leftnoteasy.cnblogs.com.如果转载,请注明出处,在未经作者同意下将本文用于商业用途,将追究其法律责任. 前言: 上次写过一篇 ...

  4. 编写高质量代码改善C#程序的157个建议——建议142:总是提供有意义的命名

    建议142:总是提供有意义的命名 除非有特殊原型,否则永远不要为自己的代码提供无意义的命名. 害怕需要过长的命名才能提供足够的意义?不要怕,其实我们更介意的是在代码的时候出现一个iTemp. int ...

  5. JavaScript执行顺序

    当JavaScript引擎解析脚本时,它会在预编译期对所有声明的变量和函数进行处理.所以,就会出现当JavaScript解释器执行下面脚本时不会报错: alert(a);                ...

  6. 理解Javascript中的事件绑定与事件委托

    最近在深入实践js中,遇到了一些问题,比如我需要为动态创建的DOM元素绑定事件,那么普通的事件绑定就不行了,于是通过上网查资料了解到事件委托,因此想总结一下js中的事件绑定与事件委托. 事件绑定   ...

  7. [leetcode] 2. Pascal's Triangle II

    我是按难度往下刷的,第二道是帕斯卡三角形二.简单易懂,题目如下: Given an index k, return the kth row of the Pascal's triangle. For ...

  8. c3p0-数据库连接池原理

    一直用c3p0很久了,但也没时间或没主动去研究过,直到最近频频在出现一些莫名其妙的问题,觉得还是有必要了解和研究一下. c3p0是什么 c3p0的出现,是为了大大提高应用程序和数据库之间访问效率的. ...

  9. [Erlang12] Mnesia分布式应用

    [Erl_Question12] Mnesia分布式应用 情景: 设计一个图书管理系统,需求: 1. 基本的增删查改功能; 2. 支持多节点备份(其中一个节点挂了进,对外接口不影响). 方案一: Er ...

  10. Crystal Reports for Visual Studio 2015 安装

    如果你在vs2015下要用到Cystal Reports,请安装下面的插件.安装时请退出vs2015,安装后重启. https://www.aspsnippets.com/Articles/Downl ...