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或 ...
随机推荐
- ExpiringMap学习总结
一.ExpiringMap简介 ExpiringMap是一个轻量级的Java缓存方式 针对一些小体量的项目,存储的数据量也不是很大(如校验码)的情况下,使用Redis会增加系统的复杂性和维护难度.它的 ...
- JS实现下拉框切换和tab标签切换
现在商城网页上会有下拉框切换内容,是如何实现的呢,研究了一天,在调整js代码和查找bug.最终完成了自己想要的效果,我没有写CSS样式,只是实现了基本功能,如果对你有所帮助,可以自己写css,使其更加 ...
- console小知识
console.log(JSON.stringify(object,null,2));
- Unity Visual Scripting 使用随记
1.Wait Until并不会再执行前面的代码,而是反复执行获取bool变量的代码:需自己拆出来写. 2.yield return null对应Wait For Next Frame,多用这个避免协程 ...
- 从XML配置角度理解Spring AOP
本文分享自华为云社区<Spring高手之路18--从XML配置角度理解Spring AOP>,作者: 砖业洋__. 1. Spring AOP与动态代理 1.1 Spring AOP和动态 ...
- NODEJS通过发送json数据查询目标服务,实现服务器状态监控,发现异常发送到微信群提醒
root@aea87fa6e6a2:/home/node# cat login2.js const request = require('request-promise'); const moment ...
- Android 13 - Media框架(14)- OpenMax(二)
关注公众号免费阅读全文,进入音视频开发技术分享群! 这一节我们将来解析 media.codec 这个 HIDL service 究竟提供了什么服务,服务是如何启动的. 1.main 函数 我们先来看 ...
- minos 2.1 中断虚拟化——ARMv8 异常处理
首发公号:Rand_cs 越往后,交叉的越多,大多都绕不开 ARMv8 的异常处理,所以必须得先了解了解 ARMv8 的异常处理流程 先说一下术语,从手册中的用词来看,在 x86 平台,一般将异常和中 ...
- 容器docker技术
我们先看看很久很久以前,服务器是怎么部署应用的! 由于物理机的诸多问题,后来出现了虚拟机. 但是虚拟化也是有局限性的,每一个虚拟机都是一个完整的操作系统,要分配系统资源,虚拟机多道一定程度时,操作系统 ...
- sshd服务部署
sshd服务部署 软件安装修改配置文件启动使用 1.搭建所有服务的套路 关闭防火墙和selinux(实验环境都先关闭掉) 配置yum源(公网源或者本地源) 软件安装和检查 了解并修改配置文件 启动服 ...