链接

BZOJ 4873

题解

当年的省选题……还记得蒟蒻的我Day1 20分滚粗……

这道题是个最大权闭合子图的套路题。严重怀疑出题人就是先画好了图然后照着图编了个3000字的题面。和我喜欢的妹子当年给别人写的情书一样长……

最大权闭合子图

最大权闭合子图问题:一个有向图中,每个点带有一个权值(有正有负),有向边\(u \to v\)表示选\(u\)必须选\(v\),选出一些点使权值和最大,问权值和最大是多少。

最大权闭合子图的解法:网络流建图,对于每个点\(u\),设权值为\(w_u\),如果\(w_u\)为正,则连边\((S, u, w_u)\);若为负,连边\((u, T, |w_u|)\)。对于原图中每条有向边\(u \to v\),连边\((u, v, +\infty)\)。

答案即为所有正点权之和减去网络流的最小割。

这道题的依赖关系很明确:

  1. 选择了一个区间\([i, j](i < j)\),则必须选择它的两个子区间\([i, j - 1], [i + 1, j]\)。
  2. 选择了一个区间\([i, i]\),则必须选择里面的唯一寿司\(i\)。
  3. 选择了一个寿司\(i\),则必须选择它的代号\(a_i\)。

点的权值也很明确:

  1. “代号”\(i\)的权值为\(- m * i ^ 2\)。
  2. “代号”为\(i\)的寿司的权值为\(- i\)。
  3. 区间\([i, j]\)的权值就是输入数据中的“美味度”。

有了权值和依赖关系,按照上面的最大权闭合子图的建图套路无脑建图即可。

  1. #include <cstdio>
  2. #include <cmath>
  3. #include <cstring>
  4. #include <algorithm>
  5. #include <queue>
  6. using namespace std;
  7. typedef long long ll;
  8. #define enter putchar('\n')
  9. #define space putchar(' ')
  10. template <class T>
  11. void read(T &x){
  12. char c;
  13. bool op = 0;
  14. while(c = getchar(), c > '9' || c < '0')
  15. if(c == '-') op = 1;
  16. x = c - '0';
  17. while(c = getchar(), c >= '0' && c <= '9')
  18. x = x * 10 + c - '0';
  19. if(op) x = -x;
  20. }
  21. template <class T>
  22. void write(T x){
  23. if(x < 0) putchar('-'), x = -x;
  24. if(x >= 10) write(x / 10);
  25. putchar('0' + x % 10);
  26. }
  27. const int N = 10005, M = 1000005, INF = 0x3f3f3f3f;
  28. int n, m, src, des, sum;
  29. int ecnt = 1, adj[N], cur[N], dis[N], nxt[M], go[M], cap[M];
  30. int a[105], w[105][105], lst[1005], idx, type_num[1005], sushi_num[105], range_num[105][105];
  31. void ADD(int u, int v, int _cap){
  32. go[++ecnt] = v;
  33. nxt[ecnt] = adj[u];
  34. adj[u] = ecnt;
  35. cap[ecnt] = _cap;
  36. }
  37. void add(int u, int v, int _cap){
  38. ADD(u, v, _cap);
  39. ADD(v, u, 0);
  40. }
  41. bool bfs(){
  42. static int que[N], qr;
  43. for(int i = 1; i <= des; i++)
  44. cur[i] = adj[i], dis[i] = -1;
  45. que[qr = 1] = src, dis[src] = 1;
  46. for(int ql = 1; ql <= qr; ql++){
  47. int u = que[ql];
  48. for(int e = adj[u], v; e; e = nxt[e])
  49. if(cap[e] && dis[v = go[e]] == -1){
  50. dis[v] = dis[u] + 1, que[++qr] = v;
  51. if(v == des) return 1;
  52. }
  53. }
  54. return 0;
  55. }
  56. int dfs(int u, int flow){
  57. if(u == des) return flow;
  58. int ret = 0, delta;
  59. for(int &e = cur[u], v; e; e = nxt[e])
  60. if(cap[e] && dis[v = go[e]] == dis[u] + 1){
  61. delta = dfs(v, min(cap[e], flow - ret));
  62. if(delta){
  63. cap[e] -= delta;
  64. cap[e ^ 1] += delta;
  65. ret += delta;
  66. if(ret == flow) return ret;
  67. }
  68. }
  69. dis[u] = -1;
  70. return ret;
  71. }
  72. int maxflow(){
  73. int ret = 0;
  74. while(bfs()) ret += dfs(src, INF);
  75. return ret;
  76. }
  77. int main(){
  78. read(n), read(m);
  79. for(int i = 1; i <= n; i++)
  80. read(a[i]), lst[++idx] = a[i];
  81. sort(lst + 1, lst + idx + 1);
  82. int tmp = idx = unique(lst + 1, lst + idx + 1) - lst - 1;
  83. for(int i = 1; i <= lst[idx]; i++)
  84. type_num[i] = lower_bound(lst + 1, lst + idx + 1, i) - lst;
  85. for(int i = 1; i <= n; i++)
  86. sushi_num[i] = ++idx;
  87. for(int i = 1; i <= n; i++)
  88. for(int j = i; j <= n; j++){
  89. range_num[i][j] = ++idx;
  90. read(w[i][j]);
  91. }
  92. src = ++idx, des = ++idx;
  93. for(int i = 1; i <= n; i++){
  94. add(sushi_num[i], des, a[i]);
  95. add(sushi_num[i], type_num[a[i]], INF);
  96. add(range_num[i][i], sushi_num[i], INF);
  97. }
  98. for(int i = 1; i <= n; i++)
  99. for(int j = i; j <= n; j++){
  100. if(j > i){
  101. add(range_num[i][j], range_num[i][j - 1], INF);
  102. add(range_num[i][j], range_num[i + 1][j], INF);
  103. }
  104. if(w[i][j] > 0) add(src, range_num[i][j], w[i][j]), sum += w[i][j];
  105. else add(range_num[i][j], des, -w[i][j]);
  106. }
  107. for(int i = 1; i <= tmp; i++)
  108. add(i, des, lst[i] * lst[i] * m);
  109. write(sum - maxflow()), enter;
  110. return 0;
  111. }

BZOJ 4873 [Shoi2017]寿司餐厅 | 网络流 最大权闭合子图的更多相关文章

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

    有正负收益,考虑最小割 因为有依赖关系,所以考虑最大权闭合子图 首先对每个d[i][j]建个点,正权连(s,id[i][j],d[i][j])并加到ans上,负权连(id[i][j],t,-d[i][ ...

  2. BZOJ_4873_[Shoi2017]寿司餐厅_最大权闭合子图

    BZOJ_4873_[Shoi2017]寿司餐厅_最大权闭合子图 题意:http://www.lydsy.com/JudgeOnline/problem.php?id=4873 分析:我们发现分数正负 ...

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

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

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

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

  5. [LOJ 2146][BZOJ 4873][Shoi2017]寿司餐厅

    [LOJ 2146][BZOJ 4873][Shoi2017]寿司餐厅 题意 比较复杂放LOJ题面好了qaq... Kiana 最近喜欢到一家非常美味的寿司餐厅用餐. 每天晚上,这家餐厅都会按顺序提供 ...

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

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

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

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

  8. BZOJ 4873 寿司餐厅(最大权闭合图 网络流)

    寿司餐厅 时间限制: 1 Sec  内存限制: 512 MB提交: 6  解决: 3[提交][状态][讨论版] 题目描述 Kiana 最近喜欢到一家非常美味的寿司餐厅用餐.每天晚上,这家餐厅都会按顺序 ...

  9. 【BZOJ】4873: [Shoi2017]寿司餐厅

    [题目]#2146. 「SHOI2017」寿司餐厅 [题意]给定n种寿司的代号,取区间[i,j]的寿司收益是d[i,j]和所有子区间的d,吃了c(c>0)种代号x的寿司的代价是mx^2+cx,给 ...

随机推荐

  1. C# 16进制与字符串、字节数组之间的转换

    1.请问c#中如何将十进制数的字符串转化成十六进制数的字符串//十进制转二进制 Console.WriteLine("十进制166的二进制表示: "+Convert.ToStrin ...

  2. Hadoop、Yarn和vcpu资源的配置

    转载自:https://www.cnblogs.com/S-tec-songjian/p/5740691.html Hadoop  YARN同时支持内存和CPU两种资源的调度(默认只支持内存,如果想进 ...

  3. struts2_maven_learning

    以下为学习maven struts2 的学习过程,现记录如下. 1.创建一个完善的maven程序 maven:(jar) 1)maven project 2)facet 3)pom.xml,depen ...

  4. C++STL之Vector的应用

    这是我第一次写博客,请多指教! vector是一种向量容器,说白了就是可以改变大小的数组. vector是一个模板类,如果直接这样会报错: vector a; //报错,因为要指定模板. 需要像这样: ...

  5. python中的-1

    -1单个使用时表示最后一个: >>> [1,2,3,4][-1] 4 表示范围(区间)时,因为是开区间表示方法,如[0:2]是不包括2的所以 [0:-1]只能访问到倒数第二个(不包括 ...

  6. linux 定时器原理

    内核定时器:    unsigned long timeout = jiffies + (x * HZ);    while(1) {        // Check the condition.   ...

  7. JavaScript实现选项卡(三种方法)

    本文实例讲述了js选项卡的实现方法. 一.html代码: <div id="div1"> <input class="active" type ...

  8. [hdu5503]EarthCup[霍尔定理]

    题意 一共 \(n\) 只球队,两两之间会进行一场比赛,赢得一分输不得分,给出每只球队最后的得分,问能否构造每场比赛的输赢情况使得得分成立.多组数据 \(T\le 10,n\le 5\times 10 ...

  9. selenium常用命令

    openopen(url)- 在浏览器中打开URL,可以接受相对和绝对路径两种形式type type(inputLocator, value)- 模拟人手的输入过程,往指定的input中输入值- 也适 ...

  10. javascript source map 的使用

    之前发现VS.NET会为压缩的js文添加一个与文件名同名的.map文件,一直没有搞懂他是用来做什么的,直接删除掉运行时浏览器又会报错,后来google了一直才真正搞懂了这个小小的map文件背后的巨大意 ...