[JSOI2009]球队收益
这题好神啊
我们发现一个球队的总比赛场数是确定的,设第\(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]球队收益的更多相关文章
- bzoj 1449 [JSOI2009]球队收益(费用拆分,最小费用流)
1449: [JSOI2009]球队收益 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 547 Solved: 302[Submit][Status][ ...
- BZOJ 1449: [JSOI2009]球队收益( 最小费用最大流)
先考虑假如全部输了的收益. 再考虑每场比赛球队赢了所得收益的增加量,用这个来建图.. --------------------------------------------------------- ...
- 【BZOJ1449】[JSOI2009]球队收益(网络流,费用流)
[BZOJ1449][JSOI2009]球队收益(网络流,费用流) 题面 BZOJ 洛谷 题解 首先对于一支队伍而言,总共进行多少场比赛显然是已知的,假设是\(n_i\)场,那么它的贡献是:\(C_i ...
- 【BZOJ 1449】 1449: [JSOI2009]球队收益 (最小费用流)
1449: [JSOI2009]球队收益 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 841 Solved: 483 Description Inpu ...
- 1449: [JSOI2009]球队收益
1449: [JSOI2009]球队收益 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 757 Solved: 437[Submit][Status][ ...
- Bzoj1449 [JSOI2009]球队收益
Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 741 Solved: 423 Description Input Output 一个整数表示联盟里所有球 ...
- 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 球队收益 费用流
题目大意:给定nn支球队.第ii支球队已经赢了winiwin_i场.输了loseilose_i场,接下来还有mm场比赛.每一个球队终于的收益为Ci∗x2i+Di∗y2iC_i*x_i^2+D_i*y_ ...
随机推荐
- 记录怎样把安全证书导入到java中的cacerts证书库
这次项目上需要去证书中解析公钥所以这里分享下方法: 首先准备一个证书文件比如叫:test.crt(一般是cer结尾) 下一步准备把证书导入到导入java中的cacerts证书库里 方法如下: 比如本地 ...
- Netty接收到一个请求但是代码段执行了两次
这是因为HttpRequestDecoder把请求拆分成HttpRequest和HttpContent两部分, 所以在建立连接的时候建立了两次.
- php+xml有什么用
很多招聘网上找php程序员的时候都说要懂xml,这个xml+php在web网站开发方面到底有什么应用呢,希望有知道的朋友能给我具体说说,谢谢了! 我说的是在网站中的实际应用有哪些,不是网上抄的xml的 ...
- PDO中的事务处理
基本原理和步骤其实都是一样的(可参看上一篇“MySQL的事务处理”),PDO中的事务处理就是调用PDO对象的三个方法: 开启事务:beginTransaction 回滚操作:rollBack 执行操作 ...
- JavaScript 事件处理机制
DOM 事件流 DOM 是一个树型结构,当一个HTML元素产生一个事件时,该事件会在该元素结点与根节点之间按特定的顺序传播,路径所经过的节点都会收到该事件,这个传播过程可称为DOM事件流.而事件传播的 ...
- 树莓派 温度监控 PWM 控制风扇 shell python c 语言
Mine: 图中圈出来的是三极管 和滤波电容 依赖库: wiringPi sudo apt-get install wiringpi Shell脚本 本文介绍使用Shell脚本在树莓派上启用软件PWM ...
- C语言中数据类型的本质
数据类型可以理解为固定内存大小的别名.比如int类型,就是表示占用4字节的内存. 1 数据类型的大小 用sizeof操作符获得数据类型的大小. 比如 int a[5]; sizeof(a)就可以得 ...
- Android--自定义弹出框-自定义dialog
项目要用到弹出框,还要和苹果的样式一样(Android真是没地位),所以就自己定义了一个,不是很像(主要是没图),但是也还可以. 废话不多说了,直接上代码 1.先看布局文件 <?xml vers ...
- Expo大作战(二十一)--expo如何分离(detach),分离后可以比react native更有优势,但也失去了expo的部分优势,
简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,讲全部来与官网 我猜去全部机翻+个人 ...
- [原创]RedHat 安装MySQL数据库
朋友购买了阿里云的服务器,服务器上自带有CentOS操作系统,但是开发软件需要自己安装,接下来将介绍本地RedHat Linux 5.10虚拟机上搭建Mysql数据库. 一.软件准备 (1)jdk-6 ...