既然是求最大值而且有收益有代价,所以考虑建立一个最大权封闭子图模型。

收益

正的美味值是收益,所以假若 \(d_{i,j} \geq 0\) 则建边 \((s,pos_{i,j},d_{i,j})\)。

代价

负的美味值是代价,所以假若 \(d_{i,j} < 0\) 则建边 \((pos_{i,j},t,-d_{i,j})\)。

吃某种代号的寿司会收钱,吃没吃和吃多少分开计算,种类 \(x\) 建边 \((x,t,m \times x^2)\)。寿司 \(i\) 建边 \((pos_{i,i},t,a_i)\)。

依赖关系

吃了区间 \([l,r]\) 内的寿司也一定吃了被这个区间所包含的区间内的寿司,所以建边 \((pos_{i,j},pos_{i+1,j})\) 与 \((pos_{i,j},pos_{i,j-1})\)。

吃没吃某一种寿司也是一种依赖关系,所有 \(a_i = x\) 的 \(i\) 建边\((pos_{i,i},x,inf)\)。

那么建完边之后跑一遍最大流即可。

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e6+114;
const int inf = INT_MAX;
int maxflow,tot=1;
int s,t,hd[maxn],road[maxn],dis[maxn];
struct edge{
int next,to,w;
}e[maxn*2];
void add(int u,int v,int w){
e[++tot].to=v;
e[tot].w=w;
e[tot].next=hd[u];
hd[u]=tot;
e[++tot].to=u;
e[tot].w=0;
e[tot].next=hd[v];
hd[v]=tot;
}
bool bfs(bool flag){
memset(dis,0,sizeof(dis));
dis[s]=1;
queue<int>Q;
Q.push(s);
while(!Q.empty())
{
int u=Q.front();
Q.pop();
road[u]=hd[u];
for(int i=hd[u];i;i=e[i].next)
{
int v=e[i].to;
if(!dis[v]&&e[i].w)
{
dis[v]=dis[u]+1;
Q.push(v);
} }
}
return dis[t]!=0;
}
int dinic(int now,int res){
if(now==t)
return res;
int tp=res;
for(int i=road[now];i;i=e[i].next)
{
int v=e[i].to;road[now]=i;
if(dis[v]==dis[now]+1&&e[i].w)
{
int k=min(e[i].w,tp);
int del=dinic(v,k);
e[i].w-=del;
e[i^1].w+=del;
tp-=del;
if(!tp)
break;
}
}
return res-tp;
}
int a[maxn],n,m,d[1001][1001],pos[1001][1001],cnt,sum;
map<int,int> vis;
map<int,int> type;
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>m;
s=++cnt;
t=++cnt;
for(int i=1;i<=n;i++){
cin>>a[i];
if(vis[a[i]]==false){
vis[a[i]]=true;
type[a[i]]=++cnt;
add(type[a[i]],t,m*a[i]*a[i]);
}
}
for(int i=1;i<=n;i++){
for(int j=i;j<=n;j++){
cin>>d[i][j];
pos[i][j]=++cnt;
}
}
for(int i=1;i<=n;i++){
for(int j=i;j<=n;j++){
if(d[i][j]>=0) sum+=d[i][j],add(s,pos[i][j],d[i][j]);
else add(pos[i][j],t,-d[i][j]);
if(i!=j){
add(pos[i][j],pos[i+1][j],inf);
add(pos[i][j],pos[i][j-1],inf);
}
}
}
for(int i=1;i<=n;i++){
add(pos[i][i],type[a[i]],inf);
add(pos[i][i],t,a[i]);
}
while(bfs(true)==true) maxflow+=dinic(s,inf);
cout<<sum-maxflow;
return 0;
}

P3749 题解的更多相关文章

  1. LibreOJ 题解汇总

    目录 #1. A + B Problem #2. Hello, World! #3. Copycat #4. Quine #7. Input Test #100. 矩阵乘法 #101. 最大流 #10 ...

  2. BZOJ4873:[SHOI2017]寿司餐厅——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=4873 https://www.luogu.org/problemnew/show/P3749 简要题 ...

  3. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  4. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  5. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  6. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  7. 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解

    题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...

  8. 2016ACM青岛区域赛题解

    A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  9. poj1399 hoj1037 Direct Visibility 题解 (宽搜)

    http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...

  10. 网络流n题 题解

    学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...

随机推荐

  1. 荒岛野人Savage

    题目描述 样例 3 1 3 4 2 7 3 3 2 1 6 分析 首先,我们先设4个变量,初始坐标 \(d[i]\),每年步数 \(p[i]\),寿命 \(l[i]\),根据题目很容易得到一个不等式 ...

  2. C语言:生成单词列表----使用单链表实现

    解决之前用结构体数组导致内存过剩问题,使用动态分配内存优化单词列表. txt文本内容不允许出现其他字符形式,这个仅限于判断在txt网页文件已经删除了超链接等,文本里面只允许出现单词才能进行判断和进行单 ...

  3. cpu的各种信息查询

    Linux查看物理CPU个数.核数.逻辑CPU个数 # 总核数 = 物理CPU个数 X 每颗物理CPU的核数 # 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数 # 查看物 ...

  4. kubernets之了解Qos等级

    一  Qos的种类 BestEffort(优先级最低) Burstable(中等优先级) Guaranteed(最高优先级) 二  Qos的作用 众所周知,节点上面的limits允许超卖,当节点上面的 ...

  5. C# java 的 equals 与 == 的区别

    C# String a = "宜春"; String b = new String(new char[] { '宜', '春' }); String c = b; //注意这里是引 ...

  6. SpringMVC在处理Ajax请求后返回void导致前台Ajax回调函数不执行

    问题简述 在一次SpringMVC项目中,前台通过Ajax请求,准备修改数据库中的数据.因为Ajax请求只是让后台更改数据,所以Controller方法根本不需要返回给前台任何数据,所以我们将Cont ...

  7. HTML——input之单行文本框

    在 HTML 中,把 <input> 标签的 type 属性设置为 text 可以表示单行文本框,又叫做常规文本框.具体语法格式如下: <input type="text& ...

  8. Java中GUI

    目录 1.Java GUI 概述 2.容器 2.1 窗口 2.2 弹窗和对话框 对话框 自定义弹窗 2.3 面板 普通面板 滚动面板 分隔面板 选项卡面板 3.布局 3.1.流式布局 3.2.网格布局 ...

  9. C# .NET 6 使用WorkFlow Core 创建工作审批流

    1,背景 工作流思想在上世纪60年代就有人提出过:70年代就有人开始尝试,但是由于当时许多的限制,工作流一直没有成功的被实现:80年代才出现第一批成功的工作流系统:90年代工作流技术走向了第一个发展高 ...

  10. 三星PM871B SATA SSD 固态硬盘评测

    三星PM871B SATA SSD 固态硬盘评测 视频测试: 外观: CDI信息: 跑分 : 260G复制测试: 听说是850EVO的OEM版本.