有正负收益,考虑最小割

因为有依赖关系,所以考虑最大权闭合子图

首先对每个d[i][j]建个点,正权连(s,id[i][j],d[i][j])并加到ans上,负权连(id[i][j],t,-d[i][j])

然后选了大区间一定会选小区间,连这样的依赖关系:(id[i][j],id[i+1][j],inf),(id[i][j],id[i][j-1],inf)

然后考虑种类带来的负收益,首先把区间依赖到点上:(id[i][j],i,ins),(id[i][j],j,inf)

关于c*x,这个直接和每个点有关系,所以连(i,t,a[i])

然后是m*x*x,连接每个点到他的种类点上:(i,id[a[i]],inf),然后种类点表示这样的负收益:(id[a[i]],t,m*a[i]*a[i])

跑最小割即可

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<queue>
  5. using namespace std;
  6. const int N=20005;
  7. int n,m,a[N],d[105][105],id[105][105],tot,s,t,h[N],cnt=1,le[N],ans;
  8. struct qwe
  9. {
  10. int ne,to,va;
  11. }e[N*30];
  12. int read()
  13. {
  14. int r=0,f=1;
  15. char p=getchar();
  16. while(p>'9'||p<'0')
  17. {
  18. if(p=='-')
  19. f=-1;
  20. p=getchar();
  21. }
  22. while(p>='0'&&p<='9')
  23. {
  24. r=r*10+p-48;
  25. p=getchar();
  26. }
  27. return r*f;
  28. }
  29. void add(int u,int v,int w)
  30. {
  31. cnt++;
  32. e[cnt].ne=h[u];
  33. e[cnt].to=v;
  34. e[cnt].va=w;
  35. h[u]=cnt;
  36. }
  37. void ins(int u,int v,int w)
  38. {
  39. add(u,v,w);
  40. add(v,u,0);
  41. }
  42. bool bfs()
  43. {
  44. memset(le,0,sizeof(le));
  45. queue<int>q;
  46. le[s]=1;
  47. q.push(s);
  48. while(!q.empty())
  49. {
  50. int u=q.front();
  51. q.pop();
  52. for(int i=h[u];i;i=e[i].ne)
  53. if(e[i].va>0&&!le[e[i].to])
  54. {
  55. le[e[i].to]=le[u]+1;
  56. q.push(e[i].to);
  57. }
  58. }
  59. return le[t];
  60. }
  61. int dfs(int u,int f)
  62. {
  63. if(u==t||!f)
  64. return f;
  65. int us=0;
  66. for(int i=h[u];i;i=e[i].ne)
  67. if(e[i].va>0&&le[e[i].to]==le[u]+1)
  68. {
  69. int t=dfs(e[i].to,min(f-us,e[i].va));
  70. e[i].va-=t;
  71. e[i^1].va+=t;
  72. us+=t;
  73. }
  74. if(!us)
  75. le[u]=0;
  76. return us;
  77. }
  78. int dinic()
  79. {
  80. int r=0;
  81. while(bfs())
  82. r+=dfs(s,1e9);
  83. return r;
  84. }
  85. int main()
  86. {
  87. n=read(),m=read();
  88. tot=n+1000;
  89. for(int i=1;i<=n;i++)
  90. a[i]=read();
  91. for(int i=1;i<=n;i++)
  92. for(int j=1;j<=n-i+1;j++)
  93. d[i][i+j-1]=read(),id[i][i+j-1]=++tot;
  94. s=0,t=tot+1;
  95. for(int i=1;i<=n;i++)
  96. for(int j=i;j<=n;j++)
  97. {
  98. if(d[i][j]>0)
  99. ins(s,id[i][j],d[i][j]),ans+=d[i][j];
  100. else
  101. ins(id[i][j],t,-d[i][j]);
  102. if(i!=j)
  103. ins(id[i][j],id[i+1][j],1e9),ins(id[i][j],id[i][j-1],1e9);
  104. ins(id[i][j],i,1e9);
  105. ins(id[i][j],j,1e9);
  106. }
  107. for(int i=1;i<=n;i++)
  108. ins(i,a[i]+n,1e9),ins(i,t,a[i]);
  109. for(int i=1;i<=1000;i++)
  110. ins(i+n,t,m*i*i);
  111. printf("%d\n",ans-dinic());
  112. return 0;
  113. }

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

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

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

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

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

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

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

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

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

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

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

  6. BZOJ 4873 [Shoi2017]寿司餐厅 | 网络流 最大权闭合子图

    链接 BZOJ 4873 题解 当年的省选题--还记得蒟蒻的我Day1 20分滚粗-- 这道题是个最大权闭合子图的套路题.严重怀疑出题人就是先画好了图然后照着图编了个3000字的题面.和我喜欢的妹子当 ...

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

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

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

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

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

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

随机推荐

  1. 用EasyDarwin进行IPTV rtsp mpeg-ts smil流的转发和分发直播服务

    对RTSP/RTP的转发和分发一直都是EasyDarwin的基础功能,尤其是在安防行业中,EasyDarwin非常贴合安防监控的需求,但一直未尝试用EasyDarwin进行IPTV的RTSP流进行转发 ...

  2. gdb coredump的使用

    1 出现core dump时最好的办法是使用gdb查看coredump文件 2 使用的条件 出现问题的代码,系统,所有涉及的代码都应该一起编译,然后得到符号表,这样加载符号表,使用coredump文件 ...

  3. linux SVN 安装配置

    svn服务器有2种运行方式 1.独立服务器 (例如:svn://xxx.com/xxx):2.借助apache.(例如:http://svn.xxx.com/xxx):为了不依赖apache,选择第一 ...

  4. STL之队列的运用

    卡片游戏:非常好地介绍了队列的特点和应用 桌上有一叠牌,从第一张牌開始从上往下依次编号1~n.当至少还剩两张牌时进行例如以下操作:把第一张牌扔掉,然后把新的第一张牌放到整叠牌的最后. 输入n,输出每次 ...

  5. 20170301 Excel 分多个sheet 导出

     要么上传个EXCEL模板 里面已经有规定好的SHEET页了   要么直接打开个EXCEL  代码里ADDsheet页来做     就是这么点区别 [园工]CD-ABAP-win<allenjj ...

  6. Servlet学习(1)

    取得HttpSession实例 在Servlet中去个一个Session对象,可以通过HttpServletRequest接口完成. HttpSession ses = request.getSess ...

  7. Struts多个文件上传

    Struts2多个文件上传 10级学员 韩晓爽课堂笔记 多个文件上传分为List集合和数组,下面我们着重介绍一下list集合的上传.都大同小异. 一 介绍 1. 在struts2文件上传的时候要先导入 ...

  8. 不使用库函数,编写函数int strcmp(char *source, char *dest) 相等返回0,不等返回-1【转】

    本文转载自:http://www.cppblog.com/mmdengwo/archive/2011/04/14/144253.aspx #include <stdio.h>#includ ...

  9. Consul环境搭建

    大家在玩的时候 一定要使用ningx 1.9以上版本啊! 下载:wget https://releases.hashicorp.com/consul/0.7.5/consul_0.7.5_linux_ ...

  10. Js中获取显示器、浏览器以及窗口等的宽度与高度的方法

    网页可见区域宽:document.body.clientWidth 网页可见区域高:document.body.clientHeight 网页可见区域宽:document.body.offsetWid ...