题目传送门:LOJ #2146

题意简述:

有 \(n\) 种寿司,第 \(i\) 种寿司的类型为 \(a_i\)。

如果你吃了第 \(i\) 种到第 \(j\) 种寿司,你会得到 \(d_{i,j}\)(\(i\le j\))的收益。

如果你吃了 \(c\)(\(c>0\))种类型为 \(x\) 的寿司,你会付出 \(mx^2+cx\) 的代价(\(m\in\{0,1\}\))。

最大化收益与代价的差。

题解:

一种经典的模型:最大权闭合子图。

模型:有若干个物品,每种物品有一个可正可负的价值 \(v_i\),选取了物品就意味着获得了价值。

物品之间有限制关系:\(x\to y\) 表示若要选择物品 \(x\) 则必须选择物品 \(y\)。

目标是最大化价值和。

显然,有时需要为了一个拥有较大价值的物品而被迫选择负价值的物品。

考虑使用最小割解决此类问题:

将每个物品与源 \(S\) 汇 \(T\) 相连。若割掉与 \(S\) 相连的边表示不选这个物品,割掉与 \(T\) 相连的边表示选择这个物品。

对于一个物品的价值 \(v\),如果 \(v>0\) 则令它与 \(S\) 相连的边的权值为 \(v\),与 \(T\) 相连的边的权值为 \(0\),将 \(v\) 加入答案。表示不选择这个物品会付出 \(v\) 的代价;

如果 \(v<0\) 则令它与 \(S\) 相连的边的权值为 \(0\),与 \(T\) 相连的边的权值为 \(-v\)(显然 \(-v>0\))。表示选择这个物品会付出 \(-v\) 的代价。

对于 \(x\to y\) 的关系,转化为 \(x\) 向 \(y\) 连一条权值为 \(\infty\) 的边,显然这条边永远不会被割,如果选择了 \(x\),即割掉 \(x\) 与 \(T\) 相连的边,那么如果不选 \(y\),即割掉 \(y\) 与 \(S\) 相连的边,就会出现路径 \(S\to x\to y\to T\),所以必须选择 \(y\)。而如果不选 \(x\) 则对 \(y\) 的选择没有影响。

因为权值全部为非负数,符合使用 Dinic 算法解决网络流的条件,结合最大流最小割定理,可以使用 Dinic 算法解决此类问题。

回到题目上来,我们将每种 \(d_{i,j}\) 的收益都看做一个物品。显然如果选择 \(d_{i,j}\)(\(i<j\)),则必须选择 \(d_{i,j-1}\) 以及 \(d_{i+1,j}\)。

而如果吃了 \(c\)(\(c>0\))种类型为 \(x\) 的寿司,需要付出 \(mx^2+cx\) 的代价。

这可以转化为:吃了每种类型为 \(x\) 的寿司需要付出 \(x\) 的代价,而吃过类型为 \(x\) 的寿司需要付出 \(mx^2\) 的代价。

选择了 \(d_{i,i}\) 就代表吃掉了第 \(i\) 种寿司,这时需要付出 \(a_i\) 的代价(\(a_i\) 是这种寿司的类型)。

选择了 \(d_{i,i}\) 还意味着:必须付出 \(m\cdot a_i^2\) 的代价,我们将每个寿司类型也看作一个物品,选择收益 \(d_{i,i}\) 则必须选择类型 \(a_i\)。

至此,所有限制都转化为了“选择 \(x\) 则必须选择 \(y\)”的形式,可以使用最大权闭合子图的模型解决了。

在代码中,\(S\)、\(T\) 分别是 \(1\) 和 \(2\) 号点,\(d_{i,j}\) 是 \(\mathrm{Id}[i][j]\) 号点,接下来的点则是每种寿司类型。

#include <cstdio>
#include <cstring>
#include <algorithm> typedef long long LL;
const LL Inf = 0x7fffffffffffffff; namespace DinicFlow {
const int MN = 6060, MM = 16055; int N, S, T;
int h[MN], iter[MN], nxt[MM * 2], to[MM * 2], tot = 1; LL w[MM * 2];
inline void ins(int u, int v, LL x) { nxt[++tot] = h[u], to[tot] = v, w[tot] = x, h[u] = tot; }
inline void insw(int u, int v, LL x) { ins(u, v, x); ins(v, u, 0); } int lv[MN], que[MN], l, r; inline bool Lvl() {
memset(lv, 0, sizeof(lv));
lv[S] = 1;
que[l = r = 1] = S;
while (l <= r) {
int u = que[l++];
for (int i = h[u]; i; i = nxt[i]) if (w[i] && !lv[to[i]]) {
lv[to[i]] = lv[u] + 1;
que[++r] = to[i];
}
}
return lv[T] != 0;
} LL Flow(int u, LL f) {
if (u == T) return f;
LL d = 0, s = 0;
for (int &i = iter[u]; i; i = nxt[i]) if (w[i] && lv[to[i]] == lv[u] + 1) {
d = Flow(to[i], std::min(f, w[i]));
f -= d, s += d;
w[i] -= d, w[i ^ 1] += d;
if (!f) break;
}
return s;
} inline LL Dinic() {
LL Ans = 0;
while (Lvl()) {
memcpy(iter + 1, h + 1, N * sizeof(h[0]));
Ans += Flow(S, Inf);
}
return Ans;
}
} const int MN = 105; int N, M, A[MN], MxA;
int F[MN][MN], Id[MN][MN], cnt;
LL Ans = 0; int main() {
scanf("%d%d", &N, &M);
for (int i = 1; i <= N; ++i) scanf("%d", &A[i]), MxA = std::max(MxA, A[i]);
DinicFlow::S = 1, DinicFlow::T = 2;
cnt = 2;
for (int i = 1; i <= N; ++i) for (int j = i; j <= N; ++j) {
scanf("%d", &F[i][j]), Id[i][j] = ++cnt;
}
for (int i = 1; i <= N; ++i) for (int j = i; j <= N; ++j) {
int cost = F[i][j];
if (i == j) {
if (M) DinicFlow::insw(Id[i][j], cnt + A[i], Inf);
cost -= A[i];
}
else {
DinicFlow::insw(Id[i][j], Id[i + 1][j], Inf);
DinicFlow::insw(Id[i][j], Id[i][j - 1], Inf);
}
if (cost > 0) DinicFlow::insw(1, Id[i][j], cost), Ans += cost;
if (cost < 0) DinicFlow::insw(Id[i][j], 2, -cost);
}
if (M) for (int i = 1; i <= MxA; ++i) DinicFlow::insw(++cnt, 2, i * i);
DinicFlow::N = cnt;
printf("%lld\n", Ans - DinicFlow::Dinic());
return 0;
}

洛谷 P3749: LOJ 2146: [SHOI2017]寿司餐厅的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  8. [bzoj4873] [洛谷P3749] [Shoi2017] 寿司餐厅

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

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

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

随机推荐

  1. 第二阶段冲刺——seven

    个人任务: 马佳慧:设计界面背景,统一风格. 王金萱:整体运行测试上传到公网上的程序. 季方:修改优化已上传的代码. 司宇航:整体调试程序继续优化. 站立会议: 任务看板和燃尽图:

  2. VS2015 C#的单元测试

    1.安装visual studio 2015过程 visual studio 会对windows系统兼容性有很高的要求,没有达到win7 sp1以上的就不给安装,贴一张官方的系统的要求吧. 很不幸的是 ...

  3. beta圆桌2!

    031602111 傅海涛 1.今天进展 文档转换差不多完成 2.存在问题 无 3.明天安排 增加新功能和完善之前的功能 4.心得体会 接口真难 031602115 黄家雄 1.今天进展 考了六级 2 ...

  4. 2013长春网赛1001 hdu 4759 Poker Shuffle

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4759 题意:有一堆2^n的牌,牌原先按(1,2,....k)排序,每一次洗牌都将牌分成两种情况:(1, ...

  5. jquery无刷新文件上传 解决IE安全性问题

    很多项目中都需要有文件上传的功能,一般文件上传有几种方式,input file表单上传,flash上传. flash就不说了,能接受flash的就用吧. 下面介绍的这种是基于input file控件的 ...

  6. LOJ#551 Matrix

    本地打表在线AC什么的最喜欢了. 题意 \(\rm Alice\)和\(\rm Bob\)在玩游戏,他们要给一个\(n\times n\)的矩阵打标记.初始时没有任何标记,每一轮\(\rm Bob\) ...

  7. BZOJ4078 WF2014Metal Processing Plant(二分答案+2-SAT)

    题面甚至没给范围,由数据可得n<=200.容易想到二分答案,暴力枚举某集合的价值,2-SATcheck一下即可.这样是O(n4logn)的. 2-SAT复杂度已经是下界,考虑如何优化枚举.稍微改 ...

  8. 洛谷SP16580 QTREE7 - Query on a tree VII(LCT,multiset)

    洛谷题目传送门 思路分析 维护子树最值还是第一次写QwQ 因为子树的最值会变化,所以不能简单地把最值记下来,还要维护一个平衡树,把每个子树的最大值扔进去,来资磁插入.删除和查询最值. 然后我就懒得手写 ...

  9. Winform Treeview 的按需加载

    最近项目里用到treeview,原先设计的是一开始就把所有数据都加载到treeview里,后来发现客户的数据量实在太大,加载所有数据要2分钟,这个是客户没法接受的.后来就考虑到用户也不是一开始就要看所 ...

  10. BZOJ1185 [HNOI2007]最小矩形覆盖 【旋转卡壳】

    题目链接 BZOJ1185 题解 最小矩形一定有一条边在凸包上,枚举这条边,然后旋转卡壳维护另外三个端点即可 计算几何细节极多 维护另外三个端点尽量不在这条边上,意味着左端点尽量靠后,右端点尽量靠前, ...