2018牛客网暑期ACM多校训练营(第二场):discount(基环树DP)
题意:有N个不同的商品,每个商品原价是Pi元,如果选择打折,可以减少Di元。 现在加一种规则,每个商品有一个友好商品Fai,如果i用原价买,则可以免费买Fai。
现在问买到所有物品的最小价格。
思路:显然是一个内向树基环。 先把悬在环上的树都求出DP[][],然后再在链上同理跑一遍DP。
我们先看树:dp[i][0]表示i节点不是原价买,dp[i][1]是原价买。 dp[i][1]对儿子没有任何要求,而dp[i][0]=min(子树随便买+自己打折买, 子树至少一个原价买+自己免费买);
#include<bits/stdc++.h>
#define ll long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=;
const ll inf=1LL<<;
int fa[maxn],Laxt[maxn],Next[maxn],To[maxn],vis[maxn];
int p[maxn],d[maxn],cnt=,N,r[maxn],tot;
ll dp[maxn][],sum[maxn],C[maxn][],ans;//0是打折或者免费,1是原价
void add(int u,int v)
{
Next[++cnt]=Laxt[u]; Laxt[u]=cnt; To[cnt]=v;
}
bool dfs(int u)
{
while(!vis[u]) vis[u]=,u=fa[u];
while(vis[u]==) vis[u]=,r[++tot]=u,u=fa[u];
}
void treedp(int u,int f)
{
if(!vis[u]) vis[u]=; //所以不要忘了标记,免得重复。
ll sum1=,Mn=inf;
for(int i=Laxt[u];i;i=Next[i]){
if(To[i]==f||To[i]==u||vis[To[i]]==) continue;
int v=To[i]; treedp(v,u);
sum1+=dp[v][];
Mn=min(Mn,dp[v][]-dp[v][]);
}
sum[u]=sum1;
dp[u][]=sum1+p[u];
dp[u][]=min(sum1+Mn,sum1+p[u]-d[u]);
}
ll solve(int u)
{
tot=; dfs(u); //找环
rep(i,,tot) treedp(r[i],);
ll res=inf;
rep(x,,){ //1表示尾巴原价买
if(x==) C[][]=dp[r[]][];
else C[][]=sum[r[]];
C[][]=dp[r[]][];
rep(i,,tot) {
C[i][]=min(C[i-][]+dp[r[i]][],C[i-][]+sum[r[i]]);
C[i][]=dp[r[i]][]+C[i-][];
}
res=min(res,C[tot][x]);
}
return res;
}
int main()
{
scanf("%d",&N);
rep(i,,N) scanf("%d",&p[i]);
rep(i,,N) scanf("%d",&d[i]);
rep(i,,N){
scanf("%d",&fa[i]);
add(fa[i],i);
}
rep(i,,N) if(!vis[i]) ans+=solve(i);
printf("%lld\n",ans);
return ;
}
2018牛客网暑期ACM多校训练营(第二场):discount(基环树DP)的更多相关文章
- 2018牛客网暑期ACM多校训练营(第二场)I- car ( 思维)
2018牛客网暑期ACM多校训练营(第二场)I- car 链接:https://ac.nowcoder.com/acm/contest/140/I来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 ...
- 2018牛客网暑期ACM多校训练营(第一场)D图同构,J
链接:https://www.nowcoder.com/acm/contest/139/D来源:牛客网 同构图:假设G=(V,E)和G1=(V1,E1)是两个图,如果存在一个双射m:V→V1,使得对所 ...
- 2018 牛客网暑期ACM多校训练营(第一场) E Removal (DP)
Removal 链接:https://ac.nowcoder.com/acm/contest/139/E来源:牛客网 题目描述 Bobo has a sequence of integers s1, ...
- 2018牛客网暑期ACM多校训练营(第十场)A Rikka with Lowbit (树状数组)
链接:https://ac.nowcoder.com/acm/contest/148/A 来源:牛客网 Rikka with Lowbit 时间限制:C/C++ 5秒,其他语言10秒 空间限制:C/C ...
- 2018牛客网暑期ACM多校训练营(第十场)J Rikka with Nickname(二分,字符串)
链接:https://ac.nowcoder.com/acm/contest/148/J?&headNav=acm 来源:牛客网 Rikka with Nickname 时间限制:C/C++ ...
- 2018牛客网暑期ACM多校训练营(第二场)J Farm(树状数组)
题意 n*m的农场有若干种不同种类作物,如果作物接受了不同种类的肥料就会枯萎.现在进行t次施肥,每次对一个矩形区域施某种类的肥料.问最后枯萎的作物是多少. 分析 作者:xseventh链接:https ...
- 2018牛客网暑期ACM多校训练营(第一场)B Symmetric Matrix(思维+数列递推)
题意 给出一个矩阵,矩阵每行的和必须为2,且是一个主对称矩阵.问你大小为n的这样的合法矩阵有多少个. 分析 作者:美食不可负064链接:https://www.nowcoder.com/discuss ...
- 2018牛客网暑期ACM多校训练营(第三场) A - PACM Team - [四维01背包][四约束01背包]
题目链接:https://www.nowcoder.com/acm/contest/141/A 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K ...
- 2018牛客网暑期ACM多校训练营(第五场) F - take - [数学期望][树状数组]
题目链接:https://www.nowcoder.com/acm/contest/143/F 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K ...
- 2018牛客网暑期ACM多校训练营(第五场) E - room - [最小费用最大流模板题]
题目链接:https://www.nowcoder.com/acm/contest/143/E 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K ...
随机推荐
- 【发现】visualvm是jdk自带的一款监控工具
visualvm是jdk自带的一款监控工具.它提供了一个可视界面,用于查看 Java 虚拟机上运行的基于 Java 技术的程序的详细信息.VisualVM 对 Java Development Kit ...
- Maven 教程(18)— 利用 Profile 构建不同环境的部署包
原文地址:https://blog.csdn.net/liupeifeng3514/article/details/79776257 接上回继续,项目开发好以后,通常要在多个环境部署,象我们公司多达5 ...
- docker 学习操作记录 5-1
记录5-1 [BEGIN] // :: Connecting to ... Connection established. To escape to local shell, press Ctrl+A ...
- 关于Linux TCP "SACK PANIC" 远程拒绝服务漏洞的修复
Linux 内核被曝存在TCP "SACK PANIC" 远程拒绝服务漏洞(漏洞编号:CVE-2019-11477,CVE-2019-11478,CVE-2019-11479),攻 ...
- Elasticsearch 7.1.1 安装 pinyin 分词器插件
1.安装maven 安装插件前,需要用 maven 进行编译生成插件包,第一步先安装 maven yum install -y maven mvn -version Apache Maven (Red ...
- 小程序 - 底部导航栏“tabBar”
小程序底部导航 1.app.json页面配置: { "pages": [ "pages/movie/movie", "pages/cinema/cin ...
- JMeter扩展插件实现对自定义协议进行支持 转
本文版权归xmeter.net 所有.欢迎转载,转载请注明出处. 摘要## JMeter本身提供了插件机制,允许第三方扩展JMeter以支持JMeter不支持的协议的测试.本文以扩展一个简单的Apac ...
- jmeter 生成不重复的手机号
String account = "${__time(yyyyMMdd,)}"+UUID.randomUUID().toString().split("-")[ ...
- Python 监控脚本
Python 监控脚本 整体通过psutil模块动态获取资源信息.下为示例图: #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time: 2019- ...
- 信安周报-第03周:DB系统表
信安之路 第03周 前言 这周自主研究的任务如下: 任务附录的解释: 文件读写在通过数据库注入漏洞获取webshell的时候很有用 系统库和表存放了很多关键信息,在利用注入漏洞获取更多信息和权限的过程 ...