P3749 题解
既然是求最大值而且有收益有代价,所以考虑建立一个最大权封闭子图模型。
收益
正的美味值是收益,所以假若 \(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 题解的更多相关文章
- LibreOJ 题解汇总
目录 #1. A + B Problem #2. Hello, World! #3. Copycat #4. Quine #7. Input Test #100. 矩阵乘法 #101. 最大流 #10 ...
- BZOJ4873:[SHOI2017]寿司餐厅——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=4873 https://www.luogu.org/problemnew/show/P3749 简要题 ...
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
- noip2016十连测题解
以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...
- BZOJ-2561-最小生成树 题解(最小割)
2561: 最小生成树(题解) Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1628 Solved: 786 传送门:http://www.lyd ...
- Codeforces Round #353 (Div. 2) ABCDE 题解 python
Problems # Name A Infinite Sequence standard input/output 1 s, 256 MB x3509 B Restoring P ...
- 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解
题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...
- 2016ACM青岛区域赛题解
A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
- poj1399 hoj1037 Direct Visibility 题解 (宽搜)
http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...
- 网络流n题 题解
学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...
随机推荐
- phpstudy8.1安装与配置
环境: window10 phpstudy8.1.1.3 Vmware安装centos7.6 使用场景 window10安装mysql和redis 在Vmware安装centos7.6 桥接模式上网 ...
- oracle中commit之后如何进行回滚
commit之后 第一种: 记住大概的时间,获取前大概时间的数据. select * from Test as of timestamp to_timestamp('2021-12-08 09:30: ...
- java中调用exe程序和问题处理
常规方法如下: public class RunExe { public static void main(String[] args) { try { // exe文件的完整路径 String fi ...
- HEOI 2024游记
(虽然是体验罢 HEOI2024游记 前 \(\,\,\)省选! \(\,\,\)得知省选可以报名体验的时候着实很兴奋 也是不假思索的就报了 Day 0 本来说是九点上大巴 结果硬生拖到十点半(恼 分 ...
- HDU-Employment Planning题解
题目在这里 -------------------------------- Employment Planning 简单的一道dp 关键的点在于想到用枚举实现各种情况的讨论 关键的注释写在代码里了 ...
- mybatis-plus id在高并发下出现重复
mybaits-plus ASSIGN_ID生成 id生成策略 在分布式高并发环境下出现重复id https://github.com/baomidou/mybatis-plus/issues/307 ...
- Chart.js (v2.9.4)概要介绍
chart.js是一个非常优秀的开源图表插件,扩展非常灵活,同时也提供了大量的钩子函数,给与用户添加自定义插件,实现个性化的需求. 具体的优势特点,这里不详述,网上大把资料,现开始正式深入了解这个插件 ...
- CSS——动画
@keyframes 规则 要创建 CSS 动画,您首先需要了解 @keyframes 规则,@keyframes 规则用来定义动画各个阶段的属性值,类似于 flash 动画中的关键帧,语法格式如下: ...
- 浅谈C#中取消令牌CancellationTokenSource
基础操作 CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(); cancellationTo ...
- 《Qt学习系列笔记》--章节索引
Qt下载.安装及环境搭建:https://www.cnblogs.com/mrlayfolk/p/13111349.html Qt初始化代码基本说明:https://www.cnblogs.com/m ...