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

题面

BZOJ

洛谷

题解

首先对于一支队伍而言,总共进行多少场比赛显然是已知的,假设是\(n_i\)场,那么它的贡献是:\(C_ix^2+D_iy^2=C_ix^2+D_i(n_i-x_i)^2=(C_i+D_i)x^2-2nD_ix+n^2D_i\)。

我们假设\(x\)增加了\(1\),考虑贡献的增量。

\((C_i+D_i)((x+1)^2-x^2)-2nD_i((x+1)-x)\)

化简之后也就是\((C_i+D_i)(2x+1)-2nD_i\)。

我们把每只队伍按照它可以赢的场次拆点,相邻场次之间加上一条费用为变化量的边就好了。

然而实际建图中并不需要拆点,因为增加量是递增的,所以只需要直接连到汇点上面去就好了。

这样子先求出初始状态下的贡献,再加上最小费用最大流就是最终的答案。

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
#define MAX 50000
#define MAXL 500000
inline int read()
{
int x=0;bool t=false;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return t?-x:x;
}
struct Line{int v,next,w,fy;}e[MAXL];
int h[MAX],cnt=2;
inline void Add(int u,int v,int w,int fy)
{
e[cnt]=(Line){v,h[u],w,fy};h[u]=cnt++;
e[cnt]=(Line){u,h[v],0,-fy};h[v]=cnt++;
}
int S,T,Cost,Flow,dis[MAX],pv[MAX],pe[MAX];
bool vis[MAX];
bool SPFA()
{
memset(dis,63,sizeof(dis));dis[S]=0;
queue<int> Q;Q.push(S);vis[S]=true;
while(!Q.empty())
{
int u=Q.front();Q.pop();
for(int i=h[u];i;i=e[i].next)
{
int v=e[i].v;
if(e[i].w&&dis[v]>dis[u]+e[i].fy)
{
dis[v]=dis[u]+e[i].fy;pe[v]=i;pv[v]=u;
if(!vis[v])vis[v]=true,Q.push(v);
}
}
vis[u]=false;
}
if(dis[T]>1e9)return false;
int flow=1e9;
for(int i=T;i!=S;i=pv[i])flow=min(flow,e[pe[i]].w);
for(int i=T;i!=S;i=pv[i])e[pe[i]].w-=flow,e[pe[i]^1].w+=flow;
Cost+=flow*dis[T];Flow+=flow;
return true;
}
int n,m,w[MAX],l[MAX],c[MAX],d[MAX],sum[MAX];
int a[MAX],b[MAX],ans,lst[MAX],tot;
int main()
{
n=read();m=read();S=0;T=n+m+1;tot=n+m;
for(int i=1;i<=n;++i)w[i]=read(),l[i]=read(),c[i]=read(),d[i]=read();
for(int i=1;i<=n;++i)sum[i]=w[i]+l[i];
for(int i=1;i<=m;++i)++sum[a[i]=read()],++sum[b[i]=read()];
for(int i=1;i<=n;++i)ans+=c[i]*w[i]*w[i]+d[i]*(sum[i]-w[i])*(sum[i]-w[i]);
for(int i=1;i<=m;++i)
{
Add(S,n+i,1,0);Add(n+i,a[i],1,0),Add(n+i,b[i],1,0);
Add(a[i],T,1,(c[a[i]]+d[a[i]])*(2*w[a[i]]+1)-2*sum[a[i]]*d[a[i]]);
Add(b[i],T,1,(c[b[i]]+d[b[i]])*(2*w[b[i]]+1)-2*sum[b[i]]*d[b[i]]);
++w[a[i]];++w[b[i]];
}
while(SPFA());
printf("%d\n",ans+Cost);
return 0;
}

【BZOJ1449】[JSOI2009]球队收益(网络流,费用流)的更多相关文章

  1. [JSOI2009] 球队收益 (费用流)

    终于来发题解啦! pdf版题解 #include<iostream> #include<cstring> #include<cstdio> #include< ...

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

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

  3. bzoj 1449 [JSOI2009]球队收益(费用拆分,最小费用流)

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

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

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

  5. Bzoj1449 [JSOI2009]球队收益

    Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 741  Solved: 423 Description Input Output 一个整数表示联盟里所有球 ...

  6. [BZOJ1449] [JSOI2009]球队收益 / [BZOJ2895] 球队预算

    Description 在一个篮球联赛里,有n支球队,球队的支出是和他们的胜负场次有关系的,具体来说,第i支球队的赛季总支出是Cix^2+Diy^2,Di<=Ci.(赢得多,给球员的奖金就多嘛) ...

  7. BZOJ 1449: [JSOI2009]球队收益 最小费用最大流 网络流

    https://www.lydsy.com/JudgeOnline/problem.php?id=1449 给每条路加上一个权值,每条路的费用是这条路的流量*权值,求最大流的最小费用. 每次spfa记 ...

  8. 【BZOJ 1449】 1449: [JSOI2009]球队收益 (最小费用流)

    1449: [JSOI2009]球队收益 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 841  Solved: 483 Description Inpu ...

  9. 1449: [JSOI2009]球队收益

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

随机推荐

  1. Junit测试中找不到junit.framework.testcase

    在使用Junit进行测试时,出现如下问题: 找不到junit.framework.testcase 解决方法: 选中项目->属性->Java构建路径->库->添加外部jar 在 ...

  2. Java面试题,Java三大特性之一——多态的理解

    首先我们知道Java是一门面向对象的语言 面向对象三大特性,封装.继承.多态. 封装.继承.多态 ↓ 无论是学习路线,还是众人的口语习惯,都是按照这个这样进行排序,这是有原因的.因为封装好了才能继承, ...

  3. 20155325 Exp7 网络欺诈防范

    实践内容(3.5分) 本实践的目标理解常用网络欺诈背后的原理,以提高防范意识,并提出具体防范方法.具体实践有 (1)简单应用SET工具建立冒名网站 (1分) (2)ettercap DNS spoof ...

  4. 【MEF】构建一个WPF版的ERP系统

    原文:[MEF]构建一个WPF版的ERP系统 引言 MEF是微软的一个扩展性框架,遵循某种约定将各个部件组合起来.而ERP系统的一大特点是模块化,它们两者的相性很好,用MEF构建一个ERP系统是相当合 ...

  5. adb连接不上手机的解决方案

    一.确认手机的USB调试接口是打开的:----------打开开发者模式,暴击手机版本号多次,直到提示已打开开发者模式. 二.使用USB线连接电脑和手机,可以首先执行adb remount(重新挂载系 ...

  6. Centos7下python3安装ipython

    一.通过压缩包安装ipython 1.下载ipython安装包 [root@localhost ~]# wget https://pypi.python.org/packages/79/63/b671 ...

  7. onSaveInstanceState和onRestoreInstanceState触发的时机

    先看Application Fundamentals上的一段话: Android calls onSaveInstanceState() before the activity becomes vul ...

  8. nginx location 正则匹配

    nginx 统计语句1.根据访问IP统计UV awk '{print $1}' access.log|sort | uniq -c |wc -l2.统计访问URL统计PV awk '{print $7 ...

  9. Windows 10无法使用debug的解决方案

    在学习汇编语言的时候,XP系统或者更早版本的默认在Dos命令下敲入debug即可进入汇编指令模式下,而在Windows 7及更高版本下,这些功能似乎都被阉割了,所以今天我们讲带大家处理一下如何解决这个 ...

  10. NX 栈不可执行的绕过方式--ROP链

    目标程序下载 提取码:5o0a 环境:Ubuntu linux 工具 pwn-gdb pwntools python库 ROPgadget ( 这些工具可以到github官网找) 1.检查程序开了哪些 ...