题目

这题好神啊

我们发现一个球队的总比赛场数是确定的,设第\(i\)支球队一共进行了\(s_i\)场比赛

于是这个球队的收益就是\(c_i\times x^2+d_i(s_i-x)^2\)

我们拆开柿子可以发现\(c_ix^2+d_ix^2+d_is_i^2-2xs_id_i\)

我们拿出和\(x\)有关的项来发现\((c_i+d_i)x^2-2s_id_ix\)

现在我们把贡献变成只和胜场数\(x\)有关了,考虑\(x+1\)的时候这个柿子的增量,我们发现是\((2x+1)(c_i+d_i)-2s_id_i\),我们发现这个增量是单增的

于是我们现在可以这样建图

对于每一场比赛我们建一个点,源点向这个点连一条流量为\(1\)费用为\(0\)的边

这个点向对应的两支球队也连一条流量为\(1\)费用为\(0\)的边

对应的两支球队向汇点连流量为\(1\)费用为对应增量的边,同时我们让这两支球队的胜场数的加\(1\)

由于增量是单增的,我们跑的是一个最小费用流,所以肯定会优先选择那些费用较小的也就是对应的胜场数较少的边了

最后的答案就是费用流跑出来的答案加上初始的贡献

代码

#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define re register
#define LL long long
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
inline int read() {
char c=getchar();int x=0;while(c<'0'||c>'9') c=getchar();
while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-48,c=getchar();return x;
}
std::queue<int> q;
const int inf=999999999;
const int maxn=6005;
struct E{int v,nxt,w,f;}e[maxn*10];
int n,m,num=1,S,T;
int head[maxn],vis[maxn],dis[maxn];
int a[maxn],b[maxn],s[maxn],c[maxn],d[maxn],x[maxn],y[maxn];
inline void C(int x,int y,int f,int w) {e[++num].v=y;e[num].nxt=head[x];head[x]=num;e[num].w=w;e[num].f=f;}
inline void add(int x,int y,int f,int w) {C(x,y,f,w),C(y,x,0,-1*w);}
inline int SPFA() {
for(re int i=S;i<=T;i++) dis[i]=inf,vis[i]=0;
dis[T]=0,q.push(T);
while(!q.empty()) {
int k=q.front();q.pop();vis[k]=0;
for(re int i=head[k];i;i=e[i].nxt)
if(e[i^1].f&&dis[e[i].v]>dis[k]+e[i^1].w) {
dis[e[i].v]=dis[k]+e[i^1].w;
if(!vis[e[i].v]) vis[e[i].v]=1,q.push(e[i].v);
}
}
return dis[S]<inf;
}
int dfs(int x,int now) {
if(x==T||!now) return now;
int flow=0,ff;vis[x]=1;
for(re int i=head[x];i;i=e[i].nxt)
if(!vis[e[i].v]&&e[i].f&&dis[e[i].v]==dis[x]+e[i^1].w) {
ff=dfs(e[i].v,min(e[i].f,now));
if(ff<=0) continue;
now-=ff,flow+=ff,e[i].f-=ff,e[i^1].f+=ff;
if(!now) break;
}
return flow;
}
inline int zkw() {
int ans=0;
while(SPFA()) {
vis[T]=1;
while(vis[T]) {
for(re int i=S;i<=T;i++) vis[i]=0;
ans+=dfs(S,inf)*dis[S];
}
}
return ans;
}
int main() {
n=read(),m=read();
for(re int i=1;i<=n;i++) a[i]=read(),b[i]=read(),c[i]=read(),d[i]=read();
for(re int i=1;i<=m;i++) x[i]=read(),y[i]=read(),s[x[i]]++,s[y[i]]++;
for(re int i=1;i<=n;i++) s[i]+=a[i]+b[i];
int ans=0;T=n+m+1;
for(re int i=1;i<=n;i++) ans+=c[i]*a[i]*a[i]+d[i]*(s[i]-a[i])*(s[i]-a[i]);
for(re int i=1;i<=m;i++) {
add(S,n+i,1,0),add(n+i,x[i],1,0),add(n+i,y[i],1,0);
add(x[i],T,1,(2*a[x[i]]+1)*(c[x[i]]+d[x[i]])-2*d[x[i]]*s[x[i]]);
add(y[i],T,1,(2*a[y[i]]+1)*(c[y[i]]+d[y[i]])-2*d[y[i]]*s[y[i]]);
a[x[i]]++,a[y[i]]++;
}
printf("%d\n",ans+zkw());
return 0;
}

[JSOI2009]球队收益的更多相关文章

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

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

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

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

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

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

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

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

  5. 1449: [JSOI2009]球队收益

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

  6. Bzoj1449 [JSOI2009]球队收益

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

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

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

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

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

  9. BZOJ 1449 JSOI2009 球队收益 费用流

    题目大意:给定nn支球队.第ii支球队已经赢了winiwin_i场.输了loseilose_i场,接下来还有mm场比赛.每一个球队终于的收益为Ci∗x2i+Di∗y2iC_i*x_i^2+D_i*y_ ...

随机推荐

  1. Windows操作系统下Redis服务安装图文详解

    Redis下载地址:https://github.com/MSOpenTech/redis/releases 下载msi格式的安装文件. 1.运行安装程序,单击next按钮. 2.勾选接受许可协议中的 ...

  2. java中带参数的try(){}语法

    带资源的try语句(try-with-resource)的最简形式为: try(Resource res = xxx)//可指定多个资源 { work with res } try块退出时,会自动调用 ...

  3. Redis哨兵(sentinel)模式搭建

    一.Sentinel介绍 之前骚了一波Redis的简介及应用场景,今天试了下他的哨兵模式: Sentinel是Redis的高可用性(HA)解决方案,由一个或多个Sentinel实例组成的Sentine ...

  4. 诡异的楼梯(bfs)hdu1180

    诡异的楼梯 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)Total Submiss ...

  5. vue 相对路径的图片 不显示问题

    例如 data () { return { img: '../../images/jifen/index/img_list_default_pic.jpg' //路径也没问题啊,怎么不显示呢,难道他瞎 ...

  6. layui table 行号

    {type: 'numbers', title: '序号', width: '80'}

  7. 分布式Session一致性解决方案有哪些?

    1.使用cookie代替session(不安全,不推荐使用) 2.使用数据库存储session(效率低,不推荐使用) 3.使用nginx反向代理ip绑定方法,同一个ip只能在同一台服务器上进行访问(不 ...

  8. Android 投射工具和录屏工具

    前言 写博客,难免需要上传手机截图或者是Gif文件,分享两个常用的工具 GifCam GifCam,一个简单的 屏幕录制工具,可以实现Gif的录制编辑和保存 Total Control Total C ...

  9. python学习笔记之——python面向对象

    Python是一门面向对象语言. 1.面向对象技术介绍 类(Class): 用来描述具有相同的属性和方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法.对象是类的实例. 类变量:类变量在整个 ...

  10. Expo大作战(八)--expo中的publish以及expo中的link,对link这块东西没有详细看,大家可以来和我交流

    简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,将全部来与官网 我猜去全部机翻+个人 ...