\(\\\)

\(Description\)


给出一棵以\(1\)为根的\(N\)个节点的树,开始的时候你在\(1\)号节点。

除了\(1\)号节点以外,每个点都有访问次数限制\(t_i\),即到达该点的次数上限。

除了\(1\)号点每个点还有一个权值\(w_i\),这个权值可以是负的,每个点被第一次到达时你会被迫得到他的点权,以后该点点权变为\(0\)。

求满足所有次数上限的前提下,从\(1\)号点出发,最后回到\(1\)号点的一条路径所得到的最大点权和,每个点可以经过多次。

同时你还要输出这个最大点权和对应的方案是否唯一。

  • \(N\in [1,10^5]\)

\(\\\)

\(Solution\)


  • 第一问直接树形\(DP\)就好,从根节点到当前点的路径会消耗一次当前点的访问次数,而每次从子树回溯上来也会消耗一次访问次数,所以对于节点\(u\),最多只能选\(t_u-1\)棵子树访问。直接\(DFS\)后将子树最大贡献排序,在所有正数答案里选前\(t_u-1\)个子树作为自己的答案。

  • 关于方案唯一性的问题,维护一个\(g\)数组表示当前节点最优解是否唯一。转移时只要有一个子树方案数有多种当前节点的方案数就是多种。同时如果下一个要选择的子树(因为访问上限的关系不能选)和当前最后一个选择的子树答案相同,或者答案中选择了包含贡献为\(0\)的子树,方案也不是唯一的。

\(\\\)

\(Code\)


#include<cmath>
#include<cstdio>
#include<cctype>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define N 100010
#define R register
#define gc getchar
#define inf 200000000
using namespace std; inline int rd(){
int x=0; bool f=0; char c=gc();
while(!isdigit(c)){if(c=='-')f=1;c=gc();}
while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=gc();}
return f?-x:x;
} bool g[N];
int n,m,tot,hd[N];
int t[N],f[N],val[N],tmp[N]; struct edge{int to,nxt;}e[N<<1]; inline void add(int u,int v){
e[++tot].to=v; e[tot].nxt=hd[u]; hd[u]=tot;
} inline bool cmp(int x,int y){return f[x]>f[y];} void dfs(int u,int fa){
f[u]=val[u];
for(R int i=hd[u],v;i;i=e[i].nxt) if((v=e[i].to)!=fa) dfs(v,u);
tmp[0]=0;
for(R int i=hd[u],v;i;i=e[i].nxt) if((v=e[i].to)!=fa) tmp[++tmp[0]]=v;
sort(tmp+1,tmp+1+tmp[0],cmp);
int ptr=1,lim=min(tmp[0],t[u]-1);
while(ptr<=lim&&f[tmp[ptr]]>=0) f[u]+=f[tmp[ptr]],g[u]|=g[tmp[ptr]],++ptr;
if((ptr<=tmp[0]&&ptr>1&&f[tmp[ptr]]==f[tmp[ptr-1]])||(f[tmp[ptr-1]]==0&&ptr>1)) g[u]=1;
} int main(){
n=rd();
for(R int i=2;i<=n;++i) val[i]=rd();
for(R int i=2;i<=n;++i) t[i]=rd();
for(R int i=1,u,v;i<n;++i){
u=rd(); v=rd(); add(u,v); add(v,u);
}
val[1]=0; t[1]=inf; dfs(1,0);
printf("%d\n",f[1]);
puts(g[1]?"solution is not unique":"solution is unique");
return 0;
}

[ JSOI 2015 ] Salesman的更多相关文章

  1. [JSOI 2015] 最大公约数

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=4488 [算法] 不妨首先枚举左端点 注意到对于任意一个正整数n , 其质因子个数是l ...

  2. [JSOI 2015] 子集选取

    4475: [Jsoi2015]子集选取 Time Limit: 1 Sec  Memory Limit: 512 MBSubmit: 363  Solved: 255[Submit][Status] ...

  3. bzoj 4481 [ Jsoi 2015 ] 非诚勿扰 —— 期望

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4481 太弱了这种题都要看半天TJ...:https://blog.csdn.net/chai ...

  4. 送礼物「JSOI 2015」RMQ+01分数规划

    [题目描述] 礼品店一共有N件礼物排成一列,每件礼物都有它的美观度.排在第\(i(1\leq i\leq N)\)个位置的礼物美观度为正整数\(A_I\).JYY决定选出其中连续的一段,即编号为礼物\ ...

  5. JSOI 2015 送礼物

    [BZOJ4476] [JSOI2015]送礼物 Description JYY和CX的结婚纪念日即将到来,JYY来到萌萌开的礼品店选购纪念礼物. 萌萌的礼品店很神奇,所有出售的礼物都按照特定的顺序都 ...

  6. GDOI#345. 送礼物「JSOI 2015」01分数规划+RMQ

    题目描述 JYY和CX的结婚纪念日即将到来,JYY来到萌萌开的礼品店选购纪念礼物.萌萌的礼品店很神奇,所有出售的礼物都按照特定的顺序都排成一列,而且相邻的礼物之间有一种神秘的美感.于是,JYY决定从中 ...

  7. JSOI BZOJ4472 salesman

    题目传送门 题目大意 某售货员小T要到若干城镇去推销商品,由于该地区是交通不便的山区,任意两个城镇之间都只有唯一的可能经过其它城镇的路线. 小T 可以准确地估计出在每个城镇停留的净收益.这些净收益可能 ...

  8. 【树形DP】JSOI BZOJ4472 salesman

    题目内容 vjudge链接 某售货员小T要到若干城镇去推销商品,由于该地区是交通不便的山区,任意两个城镇 之间都只有唯一的可能经过其它城镇的路线. 小T 可以准确地估计出在每个城镇停留的净收 益.这些 ...

  9. [Luogu 3794]签到题IV

    Description 题库链接 给定长度为 \(n\) 的序列 \(A\).求有多少子段 \([l,r]\) 满足 \[ \left(\gcd_{l\leq i\leq r}A_i\right) \ ...

随机推荐

  1. SqlServer2008必须开启哪些服务

    SQL Server 2008 大概有下面这些服务 SQL Active Directory Helper 服务支持与 Active Directory 的集成SQL Full-text Filter ...

  2. noip模拟赛 enc

    [问题背景]zhx 和他的妹子聊天.[问题描述]考虑一种简单的加密算法.假定所有句子都由小写英文字母构成, 对于每一个字母, 我们将它唯一地映射到另一个字母. 例如考虑映射规则:a->b, b- ...

  3. 转载 - Struts2拦截器配置

    出处:http://blog.csdn.net/axin66ok/article/details/7321430 目录(?)[-] 理解拦截器 1 什么是拦截器 2 拦截器的实现原理 拦截器的配置 使 ...

  4. 转载 - PowerDesigner(CDM—PDM—SQL脚本的转换流程)

    出处: http://jbeduhai.iteye.com/blog/338579 由于图片复制上去不显示,如想看内容及图片详情,请下载附件 PowerDesigner数据模型(CDM—PDM—SQL ...

  5. 如何高效读写百万级的Excel?

    高效读取百万级数据 接上一篇介绍的高效写文件之后,最近抽时间研究了下Excel文件的读取.概括来讲,poi读取excel有两种方式:用户模式和事件模式. 然而很多业务场景中的读取Excel仍然采用用户 ...

  6. RDLC报表总结

    这2天纠结的报表基本上已近完成大部分功能.现在总结一下自己近期的学习成果 首先制作微软RDLC报表由以下三部分构成:1.制作自己的DateSet集合(就是报表的数据集):2.制作自己的报表文件.rdl ...

  7. webpack打包的基础原理-打包后的文件解读

    1.概念 本质上,webpack 基于node平台,利用 node 的各种api来实现 javascript 应用程序的一个静态模块的打包工具. 在打包过程中,构建依赖关系,并且实现模块引用预处理,以 ...

  8. python 验证码 高阶验证

    python 验证码 高阶验证 标签: 验证码python 2016-08-19 15:07 1267人阅读 评论(1) 收藏 举报  分类: 其他(33)    目录(?)[+]   字符型图片验证 ...

  9. LeetCode 788. Rotated Digits (旋转数字)

    X is a good number if after rotating each digit individually by 180 degrees, we get a valid number t ...

  10. 常用的java方法,为程序添点小功能

    一.生成随机数 Random类使用示例 使用Random类,一般是生成指定区间的随机数字,下面就一一介绍如何生成对应区间的随机数字.以下生成随机数的代码均使用以下Random对象r进行生成: Rand ...