[题目链接]

https://www.lydsy.com/JudgeOnline/problem.php?id=4873

[算法]

注意到题目中的限制条件可表述为 : 若选择区间[L , R] , 则必须选择区间[L + 1 , R]和[L , R - 1] , 这种依赖关系可以让我们联想到用最大权闭合子图解题

将每种代号建一个点 , 每个区间同样建一个点

首先将每个形如[i , i]的区间向其代号连边

然后将每个区间[L , R]所代表的点向[L + 1 , R]和[L , R - 1]连边

注意我们需要减去代价mx ^ 2 + cx

那么我们将每个形如[i , i]的区间所代表点的点权减去其代号 , 将每种代号i所代表点的点权减去m * i ^ 2

时间复杂度 : O(Dinic(N ^ 2 , N ^ 2))

[代码]

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. typedef long double ld;
  5. typedef unsigned long long ull;
  6. const int N = ;
  7. const int inf = 2e9;
  8.  
  9. struct edge
  10. {
  11. int to , w , nxt;
  12. } e[N * N * ];
  13.  
  14. int n , m , cnt , mx , S , T , tot;
  15. int d[N][N] , a[N * ] , point[N][N] , head[N * N * ] , dep[N * N * ];
  16.  
  17. template <typename T> inline void chkmax(T &x,T y) { x = max(x,y); }
  18. template <typename T> inline void chkmin(T &x,T y) { x = min(x,y); }
  19. template <typename T> inline void read(T &x)
  20. {
  21. T f = ; x = ;
  22. char c = getchar();
  23. for (; !isdigit(c); c = getchar()) if (c == '-') f = -f;
  24. for (; isdigit(c); c = getchar()) x = (x << ) + (x << ) + c - '';
  25. x *= f;
  26. }
  27. inline void addedge(int u , int v , int w)
  28. {
  29. ++tot;
  30. e[tot] = (edge){v , w , head[u]};
  31. head[u] = tot;
  32. ++tot;
  33. e[tot] = (edge){u , , head[v]};
  34. head[v] = tot;
  35. }
  36. inline bool bfs()
  37. {
  38. queue< int > q;
  39. for (int i = ; i <= T; ++i)
  40. dep[i] = -;
  41. q.push(S);
  42. dep[S] = ;
  43. while (!q.empty())
  44. {
  45. int cur = q.front();
  46. q.pop();
  47. for (int i = head[cur]; i; i = e[i].nxt)
  48. {
  49. int v = e[i].to , w = e[i].w;
  50. if (w > && dep[v] == -)
  51. {
  52. dep[v] = dep[cur] + ;
  53. q.push(v);
  54. if (v == T) return true;
  55. }
  56. }
  57. }
  58. return false;
  59. }
  60. inline int dinic(int u , int flow)
  61. {
  62. int k , rest = flow;
  63. if (u == T)
  64. return flow;
  65. for (int i = head[u]; i && rest; i = e[i].nxt)
  66. {
  67. int v = e[i].to , w = e[i].w;
  68. if (w > && dep[v] == dep[u] + )
  69. {
  70. k = dinic(v , min(rest , w));
  71. e[i].w -= k;
  72. e[i ^ ].w += k;
  73. if (!k) dep[v] = ;
  74. rest -= k;
  75. }
  76. }
  77. return flow - rest;
  78. }
  79.  
  80. int main()
  81. {
  82.  
  83. read(n); read(m);
  84. tot = ;
  85. for (int i = ; i <= n; ++i)
  86. {
  87. read(a[i]);
  88. mx = max(mx , a[i]);
  89. }
  90. cnt = mx;
  91. for (int i = ; i <= n; ++i)
  92. {
  93. for (int j = i; j <= n; ++j)
  94. {
  95. read(d[i][j]);
  96. point[i][j] = ++cnt;
  97. }
  98. }
  99. S = cnt + , T = S + ;
  100. int ans = ;
  101. for (int i = ; i <= n; ++i) d[i][i] -= a[i];
  102. for (int i = ; i <= mx; ++i) addedge(i , T , m * i * i);
  103. for (int i = ; i <= n; i++) addedge(point[i][i] , a[i] , inf);
  104. for (int i = ; i <= n; ++i)
  105. {
  106. for (int j = i; j <= n; ++j)
  107. {
  108. if (i <= j - )
  109. addedge(point[i][j] , point[i][j - ] , inf);
  110. if (i + <= j)
  111. addedge(point[i][j] , point[i + ][j] , inf);
  112. if (d[i][j] >= )
  113. {
  114. ans += d[i][j];
  115. addedge(S , point[i][j] , d[i][j]);
  116. } else addedge(point[i][j] , T , -d[i][j]);
  117. }
  118. }
  119. while (bfs())
  120. {
  121. while (int flow = dinic(S , inf))
  122. ans -= flow;
  123. }
  124. printf("%d\n" , ans);
  125.  
  126. return ;
  127.  
  128. }

[SHOI 2017] 寿司餐厅的更多相关文章

  1. 【BZOJ4873】[六省联考2017]寿司餐厅(网络流)

    [BZOJ4873][六省联考2017]寿司餐厅(网络流) 题面 BZOJ 洛谷 题解 很有意思的题目 首先看到答案的计算方法,就很明显的感觉到是一个最大权闭合子图. 然后只需要考虑怎么构图就行了. ...

  2. bzoj千题计划265:bzoj4873: [六省联考2017]寿司餐厅

    http://www.lydsy.com/JudgeOnline/problem.php?id=4873 选a必选b,a依赖于b 最大权闭合子图模型 构图: 1.源点 向 正美味度区间 连 流量为 美 ...

  3. [BZOJ4873][六省联考2017]寿司餐厅(最大权闭合子图)

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

  4. P3749 [六省联考2017]寿司餐厅 最小割

    \(\color{#0066ff}{ 题目描述 }\) Kiana 最近喜欢到一家非常美味的寿司餐厅用餐. 每天晚上,这家餐厅都会按顺序提供 \(n\) 种寿司,第 \(i\) 种寿司有一个代号 \( ...

  5. 【洛谷P3749】[六省联考2017]寿司餐厅(网络流)

    洛谷 题意: 给出\(n\)份寿司,现可以选取任意多次连续区间内的寿司,对于区间\([l,r]\),那么贡献为\(\sum_{i=l}^r \sum_{j=i}^rd_{i,j}\)(对于相同的\(d ...

  6. 洛谷$P3749$ [六省联考2017] 寿司餐厅 网络流

    正解:网络流 解题报告: 传送门$QwQ$ 这道题好烦昂,,,就给了好多变量,,,但仔细读一遍题还是能$get$的所以我就不再提取一遍题目大意辣$QwQ$? 显然考虑建两排点,一排收益一排支出然后最小 ...

  7. 洛谷P3749 [六省联考2017]寿司餐厅

    传送门 题解 这几道都是上周llj讲的题,题解也写得十分好了,所以直接贴了几个链接和代码. //Achen #include<algorithm> #include<iostream ...

  8. 2017 [六省联考] T6 寿司餐厅

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

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

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

随机推荐

  1. 老毛桃winpe优盘启动系统个性修改全攻略.(全)

    博主从05年开始接触计算机,不能说是高手也算个老菜了,当时装系统还是用蕃茄花园的光盘安装系统,后来在学校管理机房,哪台电脑坏了就硬盘对拷. 时到今日,重启系统的方法五花八门,其中使用最广的莫过于PE优 ...

  2. Qt5.1.1实现调用google地图显示

    1.调用google地图工程文件 QT +=webkit QT +=webkitwidgets QT += core gui greaterThan(QT_MAJOR_VERSION, ): QT + ...

  3. log4net菜鸟指南二----生成access和txt

    前言 有可能目标计算机缺少某些组件,导致无法生成access文件,或者打不开文件,这时txt文件就可以方便的使用了 一,标准的控制台程序输出日志到access <?xml version=&qu ...

  4. innerHTML outerHTML innerText

      迁移时间--2017年10月31日14:52:59 Author:Marydon UpdateTime--2017年1月15日20:33:03innerHTML,outerHTML与innerTe ...

  5. Twitter网站架构分析介绍

    http://www.kaiyuanba.cn/html/1/131/147/7539.htm作为140个字的缔造者,twitter太简单了,又太复杂了,简单是因为仅仅用140个字居然使有几次世界性事 ...

  6. VC++的project文件

    VC++的project文件说明: *.dsp:是VC++的项目文件,文本格式. *.dsw:是工作区文件,它能够指向一个或多个.dsp文件. *.clw:是 ClassWizard信息文件,实际上是 ...

  7. JAVA传输概念

    1.VO(View Object):视图对象,用于展示在前台界面. 2.DTO(Data Transfer Object):数据传输对象,泛指用于展示层与服务层之间的数据传输对象. 3. DTO和VO ...

  8. H5 手机横竖屏判读

    $.fn.screenCheck = function() { var pDiv = $('<div></div>'); pDiv.addClass("screenC ...

  9. ajax 实现三级联动下拉菜单

    ajax 实现三级联动,相当于写了一个小插件,用的时候直接拿过来用就可以了,这里我用了数据库中的chinastates表, 数据库内容很多,三级联动里的地区名称都在里面,采用的是代号副代号的方式 比如 ...

  10. 4.改变 HTML 图像

    <!DOCTYPE html><html><body><script>function changeImage(){element=document.g ...