题目链接

BZOJ4873

题解

题意很鬼畜,就可以考虑网络流【雾】

然后就会发现这是一个裸的最大权闭合子图

就是注意要离散化一下代号

  1. #include<algorithm>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<cstdio>
  5. #include<cmath>
  6. #include<map>
  7. #define Redge(u) for (int k = h[u],to; k; k = ed[k].nxt)
  8. #define REP(i,n) for (int i = 1; i <= (n); i++)
  9. #define mp(a,b) make_pair<int,int>(a,b)
  10. #define cls(s) memset(s,0,sizeof(s))
  11. #define cp pair<int,int>
  12. #define LL long long int
  13. using namespace std;
  14. const int maxn = 11005,maxm = 8000005,INF = 1000000000;
  15. inline int read(){
  16. int out = 0,flag = 1; char c = getchar();
  17. while (c < 48 || c > 57){if (c == '-') flag = -1; c = getchar();}
  18. while (c >= 48 && c <= 57){out = (out << 3) + (out << 1) + c - 48; c = getchar();}
  19. return out * flag;
  20. }
  21. int h[maxn],ne = 1;
  22. struct EDGE{int to,nxt,f;}ed[maxm];
  23. inline void build(int u,int v,int f){
  24. ed[++ne] = (EDGE){v,h[u],f}; h[u] = ne;
  25. ed[++ne] = (EDGE){u,h[v],0}; h[v] = ne;
  26. }
  27. int cur[maxn],vis[maxn],used[maxn],d[maxn],now,S,T;
  28. int q[maxn],head,tail;
  29. inline bool bfs(){
  30. q[head = tail = 0] = S; vis[S] = now; d[S] = 0;
  31. int u;
  32. while (head <= tail){
  33. u = q[head++];
  34. Redge(u) if (ed[k].f && vis[to = ed[k].to] != now){
  35. d[to] = d[u] + 1; vis[to] = now;
  36. if (to == T) return true;
  37. q[++tail] = to;
  38. }
  39. }
  40. return vis[T] == now;
  41. }
  42. int dfs(int u,int minf){
  43. if (u == T || !minf) return minf;
  44. int flow = 0,f,to;
  45. if (used[u] != now) cur[u] = h[u],used[u] = now;
  46. for (int& k = cur[u]; k; k = ed[k].nxt)
  47. if (vis[to = ed[k].to] == now && d[to] == d[u] + 1 && (f = dfs(to,min(minf,ed[k].f)))){
  48. ed[k].f -= f; ed[k ^ 1].f += f;
  49. flow += f; minf -= f;
  50. if (!minf) break;
  51. }
  52. return flow;
  53. }
  54. int maxflow(){
  55. int flow = 0; now = 1;
  56. while (bfs()){
  57. flow += dfs(S,INF);
  58. now++;
  59. }
  60. return flow;
  61. }
  62. int n,m,w[105][105],x[105],b[maxn],tot,id[105][105],cnt,ans;
  63. int main(){
  64. n = read(); m = read(); S = 0;
  65. REP(i,n) b[i] = x[i] = read();
  66. sort(b + 1,b + 1 + n); tot = 1;
  67. for (int i = 2; i <= n; i++) if (b[i] != b[tot]) b[++tot] = b[i];
  68. for (int i = 1; i <= n; i++) x[i] = lower_bound(b + 1,b + 1 + tot,x[i]) - b;
  69. cnt = n + tot;
  70. for (int i = 1; i <= n; i++){
  71. for (int j = i; j <= n; j++){
  72. id[i][j] = ++cnt;
  73. w[i][j] = read();
  74. }
  75. }
  76. T = ++cnt;
  77. REP(i,n){
  78. build(i,x[i] + n,INF);
  79. build(i,T,b[x[i]]);
  80. }
  81. REP(i,tot) build(i + n,T,m * b[i] * b[i]);
  82. for (int i = 1; i <= n; i++){
  83. for (int j = i; j <= n; j++){
  84. if (w[i][j] >= 0) build(S,id[i][j],w[i][j]),ans += w[i][j];
  85. else build(id[i][j],T,-w[i][j]);
  86. for (int k = i; k <= j; k++)
  87. build(id[i][j],k,INF);
  88. if (i < j){
  89. build(id[i][j],id[i + 1][j],INF);
  90. build(id[i][j],id[i][j - 1],INF);
  91. }
  92. }
  93. }
  94. printf("%d\n",ans - maxflow());
  95. return 0;
  96. }

BZOJ4873 [Shoi2017]寿司餐厅 【最大权闭合子图】的更多相关文章

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

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

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

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

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

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

  4. [HEOI2017] 寿司餐厅 + 最大权闭合子图的总结

    Description 太长了自己看叭 点这里! Solution 先学一波什么叫最大权闭合子图. 先要明白什么是闭合子图,闭合子图就是给定一个有向图,从中选择一些点组成一个点集V.对于V中任意一个点 ...

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

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

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

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

  7. bzoj4873 [Shoi2017]寿司餐厅

    Input 第一行包含两个正整数n,m,分别表示这家餐厅提供的寿司总数和计算寿司价格中使用的常数. 第二行包含n个正整数,其中第k个数ak表示第k份寿司的代号. 接下来n行,第i行包含n-i+1个整数 ...

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

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

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

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

随机推荐

  1. python删除文本中的所有空字符

    import re import os input_path = 'G:/test/aa.json' output_path ='G:/test/bb.json' with open(input_pa ...

  2. java实现网页截图

    使用工具 java+selenium+phantomjs /chromedriver /firefox 1.分别是 phantomjs插件 google截图插件 和 firefox火狐浏览器截图插件2 ...

  3. openjudge-2的100次方阶乘

    开始进行的第一天 #include <stdio.h> #include <string.h> int main() { int n; scanf("%d" ...

  4. CSP201409-2:画图

    引言:CSP(http://www.cspro.org/lead/application/ccf/login.jsp)是由中国计算机学会(CCF)发起的"计算机职业资格认证"考试, ...

  5. Linux内核设计笔记7——中断

    中断与中断处理 何为中断? 一种由设备发向处理器的电信号 中断不与处理器时钟同步,随时可以发生,内核随时可能因为中断到来而被打断. 每一个中断都有唯一一个数字标志,称之为中断线(IRQ) 异常是由软件 ...

  6. Ext JS 6学习文档-第4章-数据包

    Ext JS 6学习文档-第4章-数据包 数据包 本章探索 Ext JS 中处理数据可用的工具以及服务器和客户端之间的通信.在本章结束时将写一个调用 RESTful 服务的例子.下面是本章的内容: 模 ...

  7. 六:YARN Node Labels

    参考:http://dongxicheng.org/mapreduce-nextgen/hadoop-yarn-label-based-scheduling/ 为不同的DATANODE打标签,通过标签 ...

  8. 20145214 《Java程序设计》第5周学习总结

    20145214 <Java程序设计>第5周学习总结 教材学习内容总结 try和catch Java中所有错误都会被包装为对象,可以尝试try执行程序并捕捉catch代表错误的对象后做一些 ...

  9. C语言 结构体相关 函数 指针 数组

    . 作者 : 万境绝尘 转载请注明出处 : http://www.hanshuliang.com/?post=30 . 结构体概述 : 结构体是 多个 变量的集合, 变量的类型可以不同; -- 可进行 ...

  10. 活学活用wxPython

    http://www.czug.org/python/wxpythoninaction/