1449: [JSOI2009]球队收益

Time Limit: 5 Sec  Memory Limit: 64 MB
Submit: 841  Solved: 483

Description

Input

Output

一个整数表示联盟里所有球队收益之和的最小值。

Sample Input

3 3
1 0 2 1
1 1 10 1
0 1 3 3
1 2
2 3
3 1

Sample Output

43

HINT

Source

【题意】

 给定n支球队,第i支球队已经赢了win[i]场,输了lose[i]场,接下来还有m场比赛,每个球队最终的收益为Ci∗x[i]^2+Di∗y[i]^2,其中x[i]为最终的胜场,y[i]为最终的负场,求最小化收益。

【分析】

  先差分,再拆边。

  注意,输赢都有贡献,普通做法不行。直接当成那些比赛所有人都输,那只要计算赢的那个人的贡献。

  然后差分:

  赢k-1场:c[i]*(win[i]+(k-1))^2+d[i]*(sm[i]+lose[i]-(k-1))^2

  赢k场:c[i]=(win[i]+k)^2+d[i]*(sm[i]+lose[i]-k)^2

  相减得到赢第k场:c[i]*(2*win[i]-(2*k-1))-d[i]*(2*(lose[i]+sm[i])-(2*k-1))

  这是单调的,所以把原本的贡献+最大费用流就好了。

  可以膜Po姐:http://blog.csdn.net/PoPoQQQ/article/details/46619517

  1 #include<cstdio>
  2 #include<cstdlib>
  3 #include<cstring>
  4 #include<iostream>
  5 #include<algorithm>
  6 #include<queue>
  7 using namespace std;
  8 #define Maxn 5010
  9 #define Maxm 1010
 10 #define INF 0xfffffff
 11
 12 int mymin(int x,int y) {return x<y?x:y;}
 13
 14 int win[Maxn],lose[Maxn],c[Maxn],d[Maxn],sm[Maxn];
 15
 16 struct node
 17 {
 18     int x,y,f,c,o,next;
 19 }t[Maxm*100];
 20 int len,first[Maxn*2];
 21
 22 void ins(int x,int y,int f,int c)
 23 {
 24     t[++len].x=x;t[len].y=y;t[len].f=f;t[len].c=c;
 25     t[len].next=first[x];first[x]=len;t[len].o=len+1;
 26     t[++len].x=y;t[len].y=x;t[len].f=0;t[len].c=-c;
 27     t[len].next=first[y];first[y]=len;t[len].o=len-1;
 28 }
 29
 30 queue<int > q;
 31 int st,ed;
 32 int flow[Maxn*2],pre[Maxn*2],dis[Maxn*2];
 33 bool inq[Maxn*2];
 34 bool bfs()
 35 {
 36     while(!q.empty()) q.pop();
 37     // memset(dis,-1,sizeof(dis));
 38     for(int i=1;i<=ed;i++) dis[i]=INF;
 39     memset(inq,0,sizeof(inq));
 40     flow[st]=INF;q.push(st);dis[st]=0;
 41     inq[st]=1;
 42     while(!q.empty())
 43     {
 44         int x=q.front();
 45         for(int i=first[x];i;i=t[i].next) if(t[i].f>0)
 46         {
 47             int y=t[i].y;
 48             if(dis[y]>dis[x]+t[i].c)
 49             {
 50                 dis[y]=dis[x]+t[i].c;
 51                 pre[y]=i;
 52                 flow[y]=mymin(flow[x],t[i].f);
 53                 if(!inq[y])
 54                 {
 55                     q.push(y);
 56                     inq[y]=1;
 57                 }
 58             }
 59         }
 60         q.pop();inq[x]=0;
 61     }
 62     if(dis[ed]==INF) return 0;
 63     return 1;
 64 }
 65
 66 int sum=0;
 67 int max_flow()
 68 {
 69     while(bfs())
 70     {
 71         int x=ed;
 72         sum+=flow[ed]*dis[ed];
 73         int a=flow[ed];
 74         while(x!=st)
 75         {
 76             t[pre[x]].f-=a;
 77             t[t[pre[x]].o].f+=a;
 78             x=t[pre[x]].x;
 79         }
 80     }
 81     printf("%d\n",sum);
 82 }
 83
 84 void output()
 85 {
 86     for(int i=1;i<=len;i+=2)
 87      printf("%d -> %d %d %d\n",t[i].x,t[i].y,t[i].f,t[i].c);
 88 }
 89
 90 int main()
 91 {
 92     int n,m;
 93     scanf("%d%d",&n,&m);
 94     for(int i=1;i<=n;i++) scanf("%d%d%d%d",&win[i],&lose[i],&c[i],&d[i]);
 95     st=n+m+1;ed=st+1;
 96     memset(sm,0,sizeof(sm));
 97     for(int i=1;i<=m;i++)
 98     {
 99         int x,y;
100         scanf("%d%d",&x,&y);
101         ins(x,n+i,1,0);
102         ins(y,n+i,1,0);
103         ins(n+i,ed,1,0);
104         sm[x]++;sm[y]++;
105     }
106     for(int i=1;i<=n;i++)
107     {
108         for(int j=1;j<=sm[i];j++) ins(st,i,1,c[i]*(2*win[i]+2*j-1)-d[i]*(2*(sm[i]+lose[i])-(2*j-1)));
109         sum+=c[i]*win[i]*win[i]+d[i]*(lose[i]+sm[i])*(lose[i]+sm[i]);
110     }
111     max_flow();
112     return 0;
113 }

View Code

2017-04-01 08:20:09

转载于:https://www.cnblogs.com/Konjakmoyu/p/6654405.html

【BZOJ 1449】 1449: [JSOI2009]球队收益 (最小费用流)相关推荐

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

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

  2. bzoj1449 [JSOI2009]球队收益

    Description Input Output 一个整数表示联盟里所有球队收益之和的最小值. Sample Input 3 3 1 0 2 1 1 1 10 1 0 1 3 3 1 2 2 3 3 ...

  3. [JSOI2009]球队收益

    题目 这题好神啊 我们发现一个球队的总比赛场数是确定的,设第\(i\)支球队一共进行了\(s_i\)场比赛 于是这个球队的收益就是\(c_i\times x^2+d_i(s_i-x)^2\) 我们拆开 ...

  4. [JSOI2009]球队收益 Solution

    题意:有nnn个球队,如果一支球队胜场为xix_ixi​,负场为yiy_iyi​,那么他们的奖金即为Ci×xi2+Di×yi2C_i\times x_i^2+D_i\times y_i^2Ci​×xi ...

  5. 【BZOJ-14492895】球队收益球队预算 最小费用最大流

    1449: [JSOI2009]球队收益 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 648  Solved: 364 [Submit][Status ...

  6. bzoj乱刷计划2 19/20

    前言 话说第一个乱刷计划很顺利地完成了 感觉写成一个题表的形式还是很支持的 于是我决定再开一个.. 打算 依然是可以做自己没做过的题,也可以复习做过的.同时尽量学一些自己不会的吧 乱刷计划2 3158 ...

  7. [NetworkFlow]网络流建模相关

    流 网络流问题本质上是线性规划问题的应用之一,线性规划问题的标准形式是给出一组等式约束和不等式约束,要求最优化一个线性函数. 在流问题中,变量以流量的形式出现在问题中,我们给出一个流网络(以有向图的形 ...

  8. WC2007 剪刀石头布【补集转化+比赛问题费用流】

    题目描述: N个点的竞赛图,已知一部分比赛结果,求安排剩下比赛的胜负情况,使得三元环的数量最大(A胜B,B胜C,C胜A).N<=100 题目分析: 直接统计三元环并不好做,考虑非三元环的情况,必 ...

  9. 51NOD 1449 砝码称重(贪心+进制思想)

    题目连接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1449 1449 砝码称重 题目来源: CodeForces 基 ...

最新文章

  1. NeHe OpenGL第三十九课:物理模拟
  2. SQL Server 2008中Analysis Services的新特性——深入SQL Server 2008
  3. poj1655Multiplication Puzzle
  4. 在Metro App中显示Toast notification
  5. sp_MSforeachtable简介; 遍历数据库中的所有表运行命令
  6. 如何使用计算机管理来为硬盘分区,电脑如何硬盘分区合理_电脑硬盘分区的基本步骤-win7之家...
  7. disable_irq/enable_irq使用不匹配
  8. Autofac 依赖注入框架 使用
  9. k3 审核流程图_金蝶K3系统操作流程图
  10. 数据挖掘(Data Mining)扫盲笔记
  11. 计算机视觉硕士课程南京大学,南京大学计算机系研究生课程文库
  12. HashMap底层结构
  13. Win10蓝牙开关不显示,任务栏不显示蓝牙图标解决方案
  14. 2022年12月最新快速批量删除微博内容_新版本如何批量删除微博以前发过的博文内容
  15. 精彩回顾 | 阿里云APM城市技术行·深圳站
  16. rh2288v3服务器硬盘故障,RH2288H V3服务器出现0x02000007告警
  17. b站百万Up主分享如何做内容
  18. CAD导出PDF线条很粗怎样设置?
  19. java代码自动抠图_Opencv java实现人脸抠图和行为识别
  20. html播放韰 寸 频,js根据文字获取首字母案例,直接复制在html中即可查看效果

热门文章

  1. 白鹭引擎增加点击事件实例
  2. C语言 | 内存对齐02 - 为什么会有内存对齐?它解决了什么问题
  3. STM32H743+CubeMX-定时器TIM输出PWM(PWM Generation模式)+ 中断
  4. java8 stream 分组_Java 8 中 Map 骚操作之 merge() 的用法
  5. Linux学习笔记-Makefile优化之头文件依赖
  6. c++ 使用nacos_想自学Maven?推荐Maven极简高速入门及常规使用
  7. mysql Windows导入sql 失败
  8. 软考 计算机网络,软考-计算机网络总复习
  9. java for循环前面label_Java 实例
  10. php open gl,Open GL 资料 01