Input

第一行包含两个正整数n,m,分别表示这家餐厅提供的寿司总数和计算寿司价格中使用的常数。
第二行包含n个正整数,其中第k个数ak表示第k份寿司的代号。
接下来n行,第i行包含n-i+1个整数,其中第j个数di,i+j-1表示吃掉寿司能
获得的相应的美味度,具体含义见问题描述。
N<=100,Ai<=1000

Output

输出共一行包含一个正整数,表示Kiana能获得的总美味度减去花费的总钱数的最大值。

Sample Input

3 1
2 3 2
5 -10 15
-10 15
15

Sample Output

12
分析:看出来这是一道网络流题,却不知道该如何建模......
   看到mx^2 + cx这个式子,我想起了bzoj1449的费用递增模型. 然而m和x都是固定的,每次的增量都是x,费用并不是递增的......
   然后我又想:选取若干个不同的寿司,它们之间会产生贡献. 似乎可以用最小割来做,类似bzoj3144的离散变量模型吗? 这道题选择的寿司之间没有任何限制,当然不是离散变量模型了. 
   单纯考虑最小割可以吗? 每次要求选一段连续的区间不好处理啊.
   上述尝试均失败后,果断打了暴力.
   如果把区间看作点,这道题差不多就做完了. 选择了区间[l,r],则必然会选择在[l,r]中的所有的点,这实际上就是最大权闭合子图模型. 每个区间要向所有区间内的点连边吗? 不用!利用传递关系:[l,r]向[l + 1,r]和[l,r - 1]连边.  当l == r时,就代表了一个点.
   费用要怎么处理呢? 将mx^2 + cx看作mx^2 和 cx两部分. 把编号也看作点. 如果一个编号被选择了,那么它的费用就是mx^2,不会改变.  如果一个点被选择了,那么它的费用就是它的编号.  所以每个编号向T连边,容量为m * i^2. 每个点向其所属的编号连边, 容量为inf.  每个点向T连边,容量为其编号.  这样的话选择了点i,就要割掉它到T的所有连边,即i的编号与T的连边和i与T的连边.
   具体的建图方式如下:

(参考sliverNebula的博客)

    可以这么理解:割掉S与点i的边,就是放弃了i.  割掉i与T的连边,就是选i的代价.

   做网络流的题要有把所有东西都看作“点”的想法.

  1. #include <cstdio>
  2. #include <queue>
  3. #include <cstring>
  4. #include <iostream>
  5. #include <algorithm>
  6.  
  7. using namespace std;
  8.  
  9. const int maxn = ,maxm = ,inf = 0x7fffffff;
  10. int n,m,a[],mx,d[][],cnt,pos[][],S,T,ans,head[maxn];
  11. int to[maxm],nextt[maxm],w[maxm],tot = ,vis[maxn],cur[maxn];
  12.  
  13. void add(int x,int y,int z)
  14. {
  15. w[tot] = z;
  16. to[tot] = y;
  17. nextt[tot] = head[x];
  18. head[x] = tot++;
  19.  
  20. w[tot] = ;
  21. to[tot] = x;
  22. nextt[tot] = head[y];
  23. head[y] = tot++;
  24. }
  25.  
  26. bool bfs()
  27. {
  28. queue <int> q;
  29. q.push(S);
  30. memset(vis,-,sizeof(vis));
  31. vis[S] = ;
  32. while (!q.empty())
  33. {
  34. int u = q.front();
  35. q.pop();
  36. if (u == T)
  37. return true;
  38. for (int i = head[u];i;i = nextt[i])
  39. {
  40. int v = to[i];
  41. if (w[i] && vis[v] == -)
  42. {
  43. vis[v] = vis[u] + ;
  44. q.push(v);
  45. }
  46. }
  47. }
  48. return false;
  49. }
  50.  
  51. int dfs(int u,int f)
  52. {
  53. if (u == T)
  54. return f;
  55. int res = ;
  56. for (int i = cur[u];i;i = nextt[i])
  57. {
  58. int v = to[i];
  59. if (w[i] && vis[v] == vis[u] + )
  60. {
  61. int temp = dfs(v,min(f - res,w[i]));
  62. w[i] -= temp;
  63. w[i ^ ] += temp;
  64. res += temp;
  65. if (w[i])
  66. cur[u] = i;
  67. if (res == f)
  68. return res;
  69. }
  70. }
  71. if (!res)
  72. vis[u] = -;
  73. return res;
  74. }
  75.  
  76. void dinic()
  77. {
  78. while (bfs())
  79. {
  80. for (int i = ; i <= T; i++)
  81. cur[i] = head[i];
  82. ans -= dfs(S,inf);
  83. }
  84. }
  85.  
  86. int main()
  87. {
  88. scanf("%d%d",&n,&m);
  89. for (int i = ; i <= n; i++)
  90. {
  91. scanf("%d",&a[i]);
  92. mx = max(mx,a[i]);
  93. }
  94. cnt = mx + n;
  95. for (int i = ; i <= n; i++)
  96. for (int j = i; j <= n; j++)
  97. {
  98. if (i == j)
  99. pos[i][j] = i;
  100. else
  101. pos[i][j] = ++cnt;
  102. }
  103. S = cnt + ;
  104. T = S + ;
  105. for (int i = ; i <= n; i++)
  106. for (int j = ; j <= n - i + ; j++)
  107. {
  108. scanf("%d",&d[i][i + j - ]);
  109. int l = i,r = i + j - ;
  110. if (d[l][r] < )
  111. add(pos[l][r],T,-d[l][r]);
  112. else
  113. {
  114. add(S,pos[l][r],d[l][r]);
  115. ans += d[l][r];
  116. }
  117. if (l != r)
  118. add(pos[l][r],pos[l + ][r],inf),add(pos[l][r],pos[l][r - ],inf);
  119. else
  120. {
  121. add(pos[l][r],a[l] + n,inf);
  122. add(pos[l][r],T,a[l]);
  123. }
  124. }
  125. for (int i = ; i <= mx; i++)
  126. add(i + n,T,i * i * m);
  127. dinic();
  128. printf("%d\n",ans);
  129.  
  130. return ;
  131. }

bzoj4873 [Shoi2017]寿司餐厅的更多相关文章

  1. 【最大权闭合子图】bzoj4873 [Shoi2017]寿司餐厅

    4873: [Shoi2017]寿司餐厅 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 369  Solved: 256[Submit][Status ...

  2. bzoj4873: [Shoi2017]寿司餐厅(最大权闭合子图)

    4873: [Shoi2017]寿司餐厅 大难题啊啊!!! 题目:传送门 题解:一眼题是网络流,但还是不会OTZ,菜啊... %题解... 最大权闭合子图!!! 好的...开始花式建边: 1.对于每个 ...

  3. BZOJ4873[Shoi2017]寿司餐厅——最大权闭合子图

    题目描述 Kiana最近喜欢到一家非常美味的寿司餐厅用餐.每天晚上,这家餐厅都会按顺序提供n种寿司,第i种寿司有一个 代号ai和美味度di,i,不同种类的寿司有可能使用相同的代号.每种寿司的份数都是无 ...

  4. BZOJ4873 Shoi2017寿司餐厅(最小割)

    选择了某个区间就必须选择其所有子区间,容易想到这是一个最大权闭合子图的模型.考虑将区间按长度分层,相邻层按包含关系连边,区间[i,j]的权值即di,j,其中最后一层表示长度为1的区间的同时也表示寿司本 ...

  5. BZOJ4873 [Shoi2017]寿司餐厅 【最大权闭合子图】

    题目链接 BZOJ4873 题解 题意很鬼畜,就可以考虑网络流[雾] 然后就会发现这是一个裸的最大权闭合子图 就是注意要离散化一下代号 #include<algorithm> #inclu ...

  6. bzoj4873: [Shoi2017]寿司餐厅(最小割)

    传送门 大佬们是怎么一眼看出这是一个最大权闭合子图的……大佬好强->这里 1.把所有区间$(i,j)$看成一个点,如果权值大于0,则从$S$向他连边,容量为权值,否则从它向$T$连边,容量为权值 ...

  7. 【BZOJ4873】[Shoi2017]寿司餐厅 最大权闭合图

    [BZOJ4873][Shoi2017]寿司餐厅 Description Kiana最近喜欢到一家非常美味的寿司餐厅用餐.每天晚上,这家餐厅都会按顺序提供n种寿司,第i种寿司有一个代号ai和美味度di ...

  8. BZOJ:4873: [Shoi2017]寿司餐厅

    4873: [Shoi2017]寿司餐厅 首先很开心在膜你赛的时候做了出来. 看到数据范围,看到不能dp,看到贡献去重后计算,咦,流? 那就容易了,转最大权闭合子图,每个区间建一个点,取了就一定要取他 ...

  9. bzoj 4873: [Shoi2017]寿司餐厅 [最小割]

    4873: [Shoi2017]寿司餐厅 题意:略 唯一会做的... 一眼最小割 就是最大权闭合子图呀 \(s\rightarrow d_{positive} \rightarrow -d_{negt ...

随机推荐

  1. Hyperledger Fabric CouchDB as the State Database——使用CouchDB

    使用CouchDB作为状态数据库 状态数据库选项 状态数据库包括LevelDB和CouchDB.LevelDB是嵌入在peer进程中的默认键/值状态数据库,CouchDB是一个可选的外部状态数据库.与 ...

  2. Spark Shell Examples

    Spark Shell Example 1 - Process Data from List: scala> val pairs = sc.parallelize( List( ("T ...

  3. .NET导出Excel之NPOI

    前段时间研究过微软的Excel导出.table输出Excel,而它们也存在一些弊端: 1.对于微软的Excel导出存在一些弊端,如:需要安装Office软件.速度问题: 2.table输出Excel在 ...

  4. 当Kubernets遇上阿里云 -之七层负载均衡(一).

    我们知道Kubernetes的service只能实现基于4层的负载均衡,无法提供7层之上的许多特性,诸如基于URL的负载均衡,SSL支持,三方授权等等:Ingress可以实现七层负载均衡的许多功能,唯 ...

  5. [咸恩静][Coffee House]

    歌词来源:http://music.163.com/#/song?id=5400159 하루의 시작은 향긋한 커피 [ha-lu-e xi-ja-geun hyang-geu-Tan Keo-Pi] ...

  6. 武汉天喻信息 移动安全领域 SE(Secure Element)

    产品简介: SE(Secure Element)为安全模块,是一台微型计算机,通过安全芯片和芯片操作系统(COS)实现数据安全存储.加解密运算等功能.SE可封装成各种形式,常见的有智能卡和嵌入式安全模 ...

  7. 贪吃蛇GUI Prototype

  8. OpenFlow协议

    功能 1.0版本Openflow:控制器通过Openflow协议与交换机建立了安全通道(Sceure Channel),下发流表. 1.3版本Openflow:多控制器,多流表. 用于实现Contro ...

  9. lintcode-401-排序矩阵中的从小到大第k个数

    401-排序矩阵中的从小到大第k个数 在一个排序矩阵中找从小到大的第 k 个整数. 排序矩阵的定义为:每一行递增,每一列也递增. 样例 给出 k = 4 和一个排序矩阵: [ [1 ,5 ,7], [ ...

  10. 软工网络15团队作业4——Alpha阶段敏捷冲刺-7

    一.当天站立式会议照片: 二.项目进展 昨天已完成的工作: 进一步优化功能与完善服务器. 明天计划完成的工作: 服务器是需要完善,后端的配置还需要修改. 工作中遇到的困难: 今日遇到的困难是服务器后端 ...