题意:有n个球队,m场比赛。

每个球队都已经有些胜负场次了。

每个球队的收益为Ci * wini2 - Di * losei2

求最小可能总收益。

解:

先看出一个模型:用一流量代表一个胜场,每场比赛向两支队伍连边。

然后我们发现这个费用是跟流量的平方有关的,How to do?

先观察一波:1 4 9 16 25

差分:1 3 5 7 9

然后我们就发现:如果把下面差分建成边的费用,限流为1,恰好就是收益了。

至此茅塞顿开。

首先假设所有的队伍都输了,然后每场选出一名胜者,C(2win + 1) - D(2lose - 1)为费用。

最小费用最大流即可。

 #include <cstdio>
#include <algorithm>
#include <queue>
#include <cstring> const int N = , M = ;
const int INF = 0x3f3f3f3f; struct Edge {
int nex, v;
int c, len;
}edge[M << ]; int top = ; int e[N], vis[N], pre[N];
int d[N], flow[N];
std::queue<int> Q;
int A[N], B[N], C[N], D[N], win[N], los[N], X[N], Y[N]; inline void add(int x, int y, int z, int w) {
//printf("add : %d %d \n", x, y);
top++;
edge[top].v = y;
edge[top].c = z;
edge[top].len = w;
edge[top].nex = e[x];
e[x] = top; top++;
edge[top].v = x;
edge[top].c = ;
edge[top].len = -w;
edge[top].nex = e[y];
e[y] = top;
return;
} inline bool SPFA(int s, int t) {
memset(d, 0x3f, sizeof(d));
d[s] = ;
flow[s] = INF;
vis[s] = ;
Q.push(s);
while(!Q.empty()) {
int x = Q.front();
Q.pop();
vis[x] = ;
//printf("x = %d d = %d\n", x, d[x]);
for(int i = e[x]; i; i = edge[i].nex) {
int y = edge[i].v;
if(edge[i].c && d[y] > d[x] + edge[i].len) {
d[y] = d[x] + edge[i].len;
pre[y] = i;
flow[y] = std::min(flow[x], edge[i].c);
if(!vis[y]) {
vis[y] = ;
Q.push(y);
}
}
}
}
return d[t] < INF;
} inline void update(int s, int t) {
int temp = flow[t];
while(t != s) {
int i = pre[t];
edge[i].c -= temp;
edge[i ^ ].c += temp;
t = edge[i ^ ].v;
}
return;
} inline int solve(int s, int t, int &cost) {
int ans = ;
cost = ;
while(SPFA(s, t)) {
ans += flow[t];
cost += flow[t] * d[t];
update(s, t);
}
return ans;
} int main() {
int n, m, s, t, sum = ;
scanf("%d%d", &n, &m);
s = n + m + , t = m + n + ;
for(int i = ; i <= n; i++) {
scanf("%d%d%d%d", &win[i], &los[i], &C[i], &D[i]);
/*win[i] = A[i];
los[i] = B[i];*/
}
for(int i = ; i <= m; i++) {
scanf("%d%d", &X[i], &Y[i]);
add(s, n + i, , );
add(n + i, X[i], , );
add(n + i, Y[i], , );
los[X[i]]++;
los[Y[i]]++;
}
for(int i = ; i <= n; i++) {
sum += C[i] * win[i] * win[i];
sum += D[i] * los[i] * los[i];
}
for(int i = ; i <= m; i++) {
int x = X[i], y = Y[i];
add(x, t, , C[x] * ( * win[x] + ) - D[x] * ( * los[x] - ));
add(y, t, , C[y] * ( * win[y] + ) - D[y] * ( * los[y] - ));
win[x]++;
win[y]++;
los[x]--;
los[y]--;
} int ans;
solve(s, t, ans);
printf("%d", ans + sum);
return ;
}

AC代码

洛谷P4307 球队收益的更多相关文章

  1. 洛谷 P4307 [JSOI2009]球队收益 / 球队预算(最小费用最大流)

    题面 luogu 题解 最小费用最大流 先假设剩下\(m\)场比赛,双方全输. 考虑\(i\)赢一局的贡献 \(C_i*(a_i+1)^2+D_i*(b_i-1)^2-C_i*a_i^2-D_i*b_ ...

  2. 洛谷 P2647 最大收益

    我是题面 恩,贪心,鉴定完毕. 一个物品是否放进来,取决于它是否能对答案做出贡献. 那物品i的贡献就是\(w[i]-r[i]\) 可是收益的减少是会叠加的 那就是\(w[i]-j*r[i]\),j表示 ...

  3. 洛谷P2647 最大收益

    P2647 最大收益 题目描述 现在你面前有n个物品,编号分别为1,2,3,……,n.你可以在这当中任意选择任意多个物品.其中第i个物品有两个属性Wi和Ri,当你选择了第i个物品后,你就可以获得Wi的 ...

  4. 洛谷—— P2647 最大收益

    https://www.luogu.org/problem/show?pid=2647 题目描述 现在你面前有n个物品,编号分别为1,2,3,……,n.你可以在这当中任意选择任意多个物品.其中第i个物 ...

  5. 洛谷 P2647 最大收益 题解

    题面 对于“n个物品选任意个”我们就可以想到一种递推方法,即设f[i][j]表示前i个物品选j个的最大收益 我们发现正着转移并不好转移,我们可以倒着转移,使选择的当前第i号物品为第一个物品,这样的话我 ...

  6. 【洛谷P2647】最大收益

    题目大意 现在你面前有n个物品,编号分别为1,2,3,--,n.你可以在这当中任意选择任意多个物品.其中第i个物品有两个属性Wi和Ri,当你选择了第i个物品后,你就可以获得Wi的收益:但是,你选择该物 ...

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

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

  8. 洛谷 P3410 拍照

    洛谷 P3410 拍照 题目描述 小B有n个下属,现小B要带着一些下属让别人拍照. 有m个人,每个人都愿意付给小B一定钱让n个人中的一些人进行合影.如果这一些人没带齐那么就不能拍照,小B也不会得到钱. ...

  9. 洛谷P4014 分配问题【最小/大费用流】题解+AC代码

    洛谷P4014 分配问题[最小/大费用流]题解+AC代码 题目描述 有 n 件工作要分配给 n 个人做.第 i 个人做第 j 件工作产生的效益为c ij. 试设计一个将 n 件工作分配给 n 个人做的 ...

随机推荐

  1. VSC软件快捷键

    Shift + Alt + F  格式化 Ctrl+Shift+P, F1显示命令面板 Ctrl+P快速打开,进入File… Ctrl + Shift + N新窗口/实例 Ctrl + Shift + ...

  2. python之路--JavaScript

    一. JavaScript概述 ECMAScript和JavaScript的关系 1996年11月,JavaScript的创造者--Netscape公司,希望这门语言能成为国际化标准,于是决定将Jav ...

  3. scrapy暂停和重启,及url去重原理,telenet简单使用

    一.scrapy暂停与重启 1.要暂停,就要保留一些中间信息,以便重启读取中间信息并从当前位置继续爬取,则需要一个目录存放中间信息: scrapy crawl spider_name -s JOBDI ...

  4. Fetch API & Delete & HTTP Methods

    Fetch API & Delete & HTTP Methods vue https://developer.mozilla.org/en-US/docs/Web/API/Fetch ...

  5. 思维导图,UML图,程序流程图制作从入门到精通

    工具: https://www.processon.com/ 第一 用例图 第二 时序图 第三 流程图

  6. ajax查看详细返回信息

    查看详细成功返回信息: success : function(data, textStatus, jqXHR) { console.log(data); console.log(textStatus) ...

  7. Add Languages to Your Xamarin Apps with Multilingual App Toolkit

    With Xamarin, you can extend your cross-platform apps with support for native speakers, reaching mar ...

  8. codeforces/gym/101291/B

    题意:给你n个杠铃的杆子,在给你m个杠铃片,问你能组成多少个重量不同的完整杠铃(杠铃杆子也算一个完整的的杠铃) 解题思路:dfs直接搜,数据很小,每个杠铃片有三种状态(放杆子左边,放杆子右边,两边都不 ...

  9. Nginx 多核cpu负载均衡

    L:122 查看Linux CPU 缓存大小 cat /sys/devices/system/cpu/cpu1/cache/index0/size //指令缓存 cat /sys/devices/sy ...

  10. Jquery实现检测用户输入用户名和密码不能为空

    要求 1.用户名和密码为空点击登录时提示相应的提示 2.获取用户名输入框时,错误提示清除 思路 1.创建1个input-text标签和1个input-password标签,1个input-botton ...