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 ...
随机推荐
- spark 操作hive
1.hive动态分区,只需进行以下设置 val spark = SparkSession.builder() .appName("hivetest") .master(" ...
- 如何下载最新版本和旧版本的eclipse?
1.进入官网,点击download,进入download界面,如果想要最新的版本的eclipse,直接点击下载即可,如图所示: 2.如果想下载旧版本的eclipse的话,可以点击上图的的downloa ...
- centos中更新glibc库文件到2.17
1 确保安装过gcc yum install gcc 2 获取glibc相关版本 wget http://ftp.gnu.org/pub/gnu/glibc/glibc-2.17.tar.xz 3 解 ...
- [转帖]kubernetes 常见问题整理
kubernetes 常见问题整理 https://www.cnblogs.com/qingfeng2010/p/10642408.html 使用kubectl 命令报错 报错: [root@k8s- ...
- 用ab每隔30分钟并发一次休息10分钟
linux脚本监控程序运行情况(重启程序)主要有两种情况:一种是一个可执行文件:如shell脚本文件:另一种是使用python打开的多个程序.第一种:它的进程名字由路径名字和程序名字组成,比如:我有个 ...
- 关于mysql的null相关查询的一些坑
我们先看一下效果,然后在解释,示例如下: mysql> create table test5 (a int not null,b int,c varchar(10)); Query OK, 0 ...
- Java学习:等待唤醒机制
等待唤醒机制 线程的状态 NEW 至今尚未启动的线程处于这种状态 RUNNABLE 正在Java虚拟机中执行的线程处于这种状态 BLOCKED 受阻塞并等待某个监视器锁的线程处于这种状态 WA ...
- bootstrap vs react
我觉得react是js 框架,而bootstrap只是一个前端ui框架 bootstrap:基于html的UI构建工具: react:基于组建的工程构建方式:
- markdown使用emoji
前几日写博客的时候在想是否能够在markdown中使用emoji呢
- 安装和启动docker
1.安装和启动docker yum update -y yum install -y yum-utils yum-config-manager --add-repo https://download. ...