[SHOI 2017] 寿司餐厅
[题目链接]
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))
[代码]
- #include<bits/stdc++.h>
- using namespace std;
- typedef long long ll;
- typedef long double ld;
- typedef unsigned long long ull;
- const int N = ;
- const int inf = 2e9;
- struct edge
- {
- int to , w , nxt;
- } e[N * N * ];
- int n , m , cnt , mx , S , T , tot;
- int d[N][N] , a[N * ] , point[N][N] , head[N * N * ] , dep[N * N * ];
- template <typename T> inline void chkmax(T &x,T y) { x = max(x,y); }
- template <typename T> inline void chkmin(T &x,T y) { x = min(x,y); }
- template <typename T> inline void read(T &x)
- {
- T f = ; x = ;
- char c = getchar();
- for (; !isdigit(c); c = getchar()) if (c == '-') f = -f;
- for (; isdigit(c); c = getchar()) x = (x << ) + (x << ) + c - '';
- x *= f;
- }
- inline void addedge(int u , int v , int w)
- {
- ++tot;
- e[tot] = (edge){v , w , head[u]};
- head[u] = tot;
- ++tot;
- e[tot] = (edge){u , , head[v]};
- head[v] = tot;
- }
- inline bool bfs()
- {
- queue< int > q;
- for (int i = ; i <= T; ++i)
- dep[i] = -;
- q.push(S);
- dep[S] = ;
- while (!q.empty())
- {
- int cur = q.front();
- q.pop();
- for (int i = head[cur]; i; i = e[i].nxt)
- {
- int v = e[i].to , w = e[i].w;
- if (w > && dep[v] == -)
- {
- dep[v] = dep[cur] + ;
- q.push(v);
- if (v == T) return true;
- }
- }
- }
- return false;
- }
- inline int dinic(int u , int flow)
- {
- int k , rest = flow;
- if (u == T)
- return flow;
- for (int i = head[u]; i && rest; i = e[i].nxt)
- {
- int v = e[i].to , w = e[i].w;
- if (w > && dep[v] == dep[u] + )
- {
- k = dinic(v , min(rest , w));
- e[i].w -= k;
- e[i ^ ].w += k;
- if (!k) dep[v] = ;
- rest -= k;
- }
- }
- return flow - rest;
- }
- int main()
- {
- read(n); read(m);
- tot = ;
- for (int i = ; i <= n; ++i)
- {
- read(a[i]);
- mx = max(mx , a[i]);
- }
- cnt = mx;
- for (int i = ; i <= n; ++i)
- {
- for (int j = i; j <= n; ++j)
- {
- read(d[i][j]);
- point[i][j] = ++cnt;
- }
- }
- S = cnt + , T = S + ;
- int ans = ;
- for (int i = ; i <= n; ++i) d[i][i] -= a[i];
- for (int i = ; i <= mx; ++i) addedge(i , T , m * i * i);
- for (int i = ; i <= n; i++) addedge(point[i][i] , a[i] , inf);
- for (int i = ; i <= n; ++i)
- {
- for (int j = i; j <= n; ++j)
- {
- if (i <= j - )
- addedge(point[i][j] , point[i][j - ] , inf);
- if (i + <= j)
- addedge(point[i][j] , point[i + ][j] , inf);
- if (d[i][j] >= )
- {
- ans += d[i][j];
- addedge(S , point[i][j] , d[i][j]);
- } else addedge(point[i][j] , T , -d[i][j]);
- }
- }
- while (bfs())
- {
- while (int flow = dinic(S , inf))
- ans -= flow;
- }
- printf("%d\n" , ans);
- return ;
- }
[SHOI 2017] 寿司餐厅的更多相关文章
- 【BZOJ4873】[六省联考2017]寿司餐厅(网络流)
[BZOJ4873][六省联考2017]寿司餐厅(网络流) 题面 BZOJ 洛谷 题解 很有意思的题目 首先看到答案的计算方法,就很明显的感觉到是一个最大权闭合子图. 然后只需要考虑怎么构图就行了. ...
- bzoj千题计划265:bzoj4873: [六省联考2017]寿司餐厅
http://www.lydsy.com/JudgeOnline/problem.php?id=4873 选a必选b,a依赖于b 最大权闭合子图模型 构图: 1.源点 向 正美味度区间 连 流量为 美 ...
- [BZOJ4873][六省联考2017]寿司餐厅(最大权闭合子图)
4873: [Shoi2017]寿司餐厅 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 490 Solved: 350[Submit][Status ...
- P3749 [六省联考2017]寿司餐厅 最小割
\(\color{#0066ff}{ 题目描述 }\) Kiana 最近喜欢到一家非常美味的寿司餐厅用餐. 每天晚上,这家餐厅都会按顺序提供 \(n\) 种寿司,第 \(i\) 种寿司有一个代号 \( ...
- 【洛谷P3749】[六省联考2017]寿司餐厅(网络流)
洛谷 题意: 给出\(n\)份寿司,现可以选取任意多次连续区间内的寿司,对于区间\([l,r]\),那么贡献为\(\sum_{i=l}^r \sum_{j=i}^rd_{i,j}\)(对于相同的\(d ...
- 洛谷$P3749$ [六省联考2017] 寿司餐厅 网络流
正解:网络流 解题报告: 传送门$QwQ$ 这道题好烦昂,,,就给了好多变量,,,但仔细读一遍题还是能$get$的所以我就不再提取一遍题目大意辣$QwQ$? 显然考虑建两排点,一排收益一排支出然后最小 ...
- 洛谷P3749 [六省联考2017]寿司餐厅
传送门 题解 这几道都是上周llj讲的题,题解也写得十分好了,所以直接贴了几个链接和代码. //Achen #include<algorithm> #include<iostream ...
- 2017 [六省联考] T6 寿司餐厅
4873: [Shoi2017]寿司餐厅 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 450 Solved: 316[Submit][Status ...
- 【最大权闭合子图】bzoj4873 [Shoi2017]寿司餐厅
4873: [Shoi2017]寿司餐厅 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 369 Solved: 256[Submit][Status ...
随机推荐
- 老毛桃winpe优盘启动系统个性修改全攻略.(全)
博主从05年开始接触计算机,不能说是高手也算个老菜了,当时装系统还是用蕃茄花园的光盘安装系统,后来在学校管理机房,哪台电脑坏了就硬盘对拷. 时到今日,重启系统的方法五花八门,其中使用最广的莫过于PE优 ...
- Qt5.1.1实现调用google地图显示
1.调用google地图工程文件 QT +=webkit QT +=webkitwidgets QT += core gui greaterThan(QT_MAJOR_VERSION, ): QT + ...
- log4net菜鸟指南二----生成access和txt
前言 有可能目标计算机缺少某些组件,导致无法生成access文件,或者打不开文件,这时txt文件就可以方便的使用了 一,标准的控制台程序输出日志到access <?xml version=&qu ...
- innerHTML outerHTML innerText
迁移时间--2017年10月31日14:52:59 Author:Marydon UpdateTime--2017年1月15日20:33:03innerHTML,outerHTML与innerTe ...
- Twitter网站架构分析介绍
http://www.kaiyuanba.cn/html/1/131/147/7539.htm作为140个字的缔造者,twitter太简单了,又太复杂了,简单是因为仅仅用140个字居然使有几次世界性事 ...
- VC++的project文件
VC++的project文件说明: *.dsp:是VC++的项目文件,文本格式. *.dsw:是工作区文件,它能够指向一个或多个.dsp文件. *.clw:是 ClassWizard信息文件,实际上是 ...
- JAVA传输概念
1.VO(View Object):视图对象,用于展示在前台界面. 2.DTO(Data Transfer Object):数据传输对象,泛指用于展示层与服务层之间的数据传输对象. 3. DTO和VO ...
- H5 手机横竖屏判读
$.fn.screenCheck = function() { var pDiv = $('<div></div>'); pDiv.addClass("screenC ...
- ajax 实现三级联动下拉菜单
ajax 实现三级联动,相当于写了一个小插件,用的时候直接拿过来用就可以了,这里我用了数据库中的chinastates表, 数据库内容很多,三级联动里的地区名称都在里面,采用的是代号副代号的方式 比如 ...
- 4.改变 HTML 图像
<!DOCTYPE html><html><body><script>function changeImage(){element=document.g ...