[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_ ...
随机推荐
- CRC16位校验
之前有跟第三方通讯合作,应为CRC表码问题导致校验出结果不一致,纠结了很久,最后直接采用CRC计算方式校验才解决. 两种方式贴,自行对比. CRC校验计算方法 private ushort CRC_1 ...
- VB.NET工作记录
1.字符串移除最后一个字符 s = s.Remove(s.Length - 1, 1) 2.日期格式 常用:yyyy-MM-dd HH:mm:ss 毫秒用fff 字符 说明 (:) 时间分隔符.在某些 ...
- WebFrom 【内置对象】— —跳转页面,页面传值
Response -- 响应请求对象 传值 Response.Redirect("url"); -- 地址?变量= 值 Response -- ...
- sqlserver C# 数据类型对照表(转载)
数据库中字段类型对应C#中的数据类型: 数据库 C#程序 int int32 text string bigint int64 或 longbinary System ...
- <mvc:annotation-driven /> 作用
<mvc:annotation-driven /> 是一种简写形式,完全可以手动配置替代这种简写形式,简写形式可以让初学都快速应用默认配置方案.<mvc:annotation-dri ...
- C#进行数据筛选(二)
这里介绍LINQ+Lambda表达式进行数据筛选的方式 这里是第一种方式,还是使用了if条件语句去判断,根据选择的条件去筛选出我所需要的数据 public GxAnaly SelectDay(stri ...
- Vue: ES6常用语法
ES6 模板字符串: ~ ${变量名}~ <div id="app"></div> <script> /* 找到对应id */ let ite ...
- django-csrf攻击
一.原理 csrf(Cross Site Request Forgery, 跨站域请求伪造:CSRF 攻击允许恶意用户在另一个用户不知情或者未同意的情况下,以他的身份执 行操作. CSRF 攻击是黑客 ...
- View的draw机制
View:1.draw//绘制一个View以及他的子View.最好不要覆写该方法,应该覆写onDraw方法来绘制自己.public void draw(Canvas canvas); public v ...
- WiFi 统一管理以及设备自动化测试实践
ATX 安卓设备 WiFi 统一管理以及设备自动化测试实践 (零散知识梳理总结) 此文为转载,感谢作者 目录 众所周知,安卓单台设备的UI自动化测试已经比较完善了,有数不清的自动化框架或者工具.但 ...