可以发现,每个特殊点可以贡献的部分在树上是一条链。

设三元组(v,x,y)表示路径长度,需要更新的端点,与当前点的lca为y。

对于每个节点x,通过两遍树形DP可以求出:

d[x]:x到x子树内的某个特殊点的最优解。

u[x]:x到x子树外的某个特殊点的最优解。

pre[x]:x以及x之前的兄弟的d[]的最优解。

suf[x]:x以及x之后的兄弟的d[]的最优解。

然后在树上打标记,最后dfs一遍统计答案即可。

时间复杂度$O(n)$。

#include<cstdio>
#define N 100010
int n,m,i,x,y,z,vip[N],ans1,ans2;
int g[N],v[N<<1],w[N<<1],nxt[N<<1],ed,dis[N],q[N],t,tag[N],cnt[N];
struct P{
int v,x,y;
P(){v=-1;}
P(int _v,int _x,int _y){v=_v,x=_x,y=_y;}
}d[N],u[N],pre[N],suf[N],fin[N];
inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}
inline void add(int x,int y,int z){v[++ed]=y;w[ed]=z;nxt[ed]=g[x];g[x]=ed;}
void dfs1(int x,int f){
if(vip[x])d[x]=P(0,x,x);
for(int i=g[x];i;i=nxt[i])if(v[i]!=f){
int y=v[i];dis[y]=w[i];
dfs1(y,x);
if(d[y].v<0)continue;
if(d[y].v+w[i]>d[x].v)d[x]=d[y],d[x].v+=w[i];
else if(d[y].v+w[i]==d[x].v)d[x].x=x;
}
d[x].y=x;
fin[x]=d[x];
}
void dfs2(int x,int f){
if(vip[x]&&u[x].v<0)u[x]=P(0,x,x);
t=0;
for(int i=g[x];i;i=nxt[i])if(v[i]!=f)q[++t]=v[i];
for(int i=1;i<=t;i++){
int y=q[i];
pre[i]=pre[i-1];
if(d[y].v<0)continue;
if(d[y].v+dis[y]>pre[i].v)pre[i]=d[y],pre[i].v+=dis[y];
else if(d[y].v+dis[y]>pre[i].v)pre[i].x=x;
}
suf[t+1]=P();
for(int i=t;i;i--){
int y=q[i];
suf[i]=suf[i+1];
if(d[y].v<0)continue;
if(d[y].v+dis[y]>suf[i].v)suf[i]=d[y],suf[i].v+=dis[y];
else if(d[y].v+dis[y]>suf[i].v)suf[i].x=x;
}
for(int i=1;i<=t;i++){
int y=q[i];
P B=pre[i-1];
if(B.v<suf[i+1].v)B=suf[i+1];
else if(B.v==suf[i+1].v)B.x=x;
B.y=x;
if(B.v<u[x].v)B=u[x];
else if(B.v==u[x].v)B.x=x;
if(~B.v)B.v+=dis[y];
u[y]=B;
if(!vip[y])continue;
if(B.v>fin[y].v)fin[y]=B;
else if(B.v==fin[y].v)fin[y].v=-1;
}
for(int i=g[x];i;i=nxt[i])if(v[i]!=f)dfs2(v[i],x);
}
inline void modify(int x,int y,int z){tag[x]++,tag[y]++,tag[z]-=2,cnt[z]++;}
void dfs3(int x,int f){
for(int i=g[x];i;i=nxt[i])if(v[i]!=f)dfs3(v[i],x),tag[x]+=tag[v[i]];
cnt[x]+=tag[x];
}
int main(){
read(n),read(m);
for(i=1;i<=m;i++)read(x),vip[x]=1;
for(i=1;i<n;i++)read(x),read(y),read(z),add(x,y,z),add(y,x,z);
dfs1(1,0),dfs2(1,0);
for(i=1;i<=n;i++)if(vip[i])if(~fin[i].v)modify(i,fin[i].x,fin[i].y);
dfs3(1,0);
for(i=1;i<=n;i++)if(!vip[i]){
if(cnt[i]>ans1)ans1=cnt[i],ans2=1;
else if(cnt[i]==ans1)ans2++;
}
return printf("%d %d",ans1,ans2),0;
}

  

BZOJ4342 : CF348 Pilgrims的更多相关文章

  1. Codeforces-348E Pilgrims

    #4342. CF348 Pilgrims 此题同UOJ#11 ydc的大树 Online Judge:Bzoj-4342,Codeforces-348E,Luogu-CF348E,Uoj-#11 L ...

  2. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  3. 题解-CF348E Pilgrims

    题面 CF348E Pilgrims 有一棵 \(n\) 个点的 带权 树和 \(m\) 个关键点,要求杀了一个不关键的点,满足最多的关键点到离它最远的所有关键点的路径都被打断.求可以满足的最多关键点 ...

  4. 越狱Season 1- Episode 18: Bluff

    Season 1, Episode 18: Bluff -Michael: Scofield Scofield Michael Scofield Michael Scofield -Patoshik: ...

  5. python瓦登尔湖词频统计

    #瓦登尔湖词频统计: import string path = 'D:/python3/Walden.txt' with open(path,'r',encoding= 'utf-8') as tex ...

  6. 每日英语:Who Ruined The Humanities?

    You've probably heard the baleful reports. The number of college students majoring in the humanities ...

  7. A Child's History of England.28

    By such means, and by taxing and oppressing the English people in every possible way, the Red King b ...

随机推荐

  1. DNS服务器配置

    导读 DNS(Domain Name Server,域名服务器)是进行域名(domain name)和与之相对应的IP地址 (IP address)转换的服务器.DNS中保存了一张域名(domain ...

  2. linux 使用 ionice 限制 Xen 虚拟机磁盘 IO

    作为 VPS 服务商我们需要保证每个 VPS 公平的使用 host(服务器)的资源,避免某个 VPS 因为程序死循环.挂起.滥用等因素 “拖累” 其他 VPS,如果出现这个情况如何临时限制这个 VPS ...

  3. 响应式Web设计(Responsive Web design)

    中文名 响应式Web设计 提出时间 2010年5月 英    文 Responsive Web design 解    释 一个网站能够兼容多个终端 目    的 解决移动互联网的浏览 优    点 ...

  4. 【转】基于LDA的Topic Model变形

    转载自wentingtu 基于LDA的Topic Model变形最近几年来,随着LDA的产生和发展,涌现出了一批搞Topic Model的牛人.我主要关注了下面这位大牛和他的学生:David M. B ...

  5. sharepoint更新多行文本webparth

    前台 <script> function Copy() { var value = document.getElementById("<%=BodyBox.ClientID ...

  6. July 31st, Week 32nd Sunday, 2016

    If you wept for the missing sunset, you would miss all the shining stars. 如果你为错过夕阳而哭泣,那你有可能也会错过灿烂的星空 ...

  7. fedora 添加其他操作系统到 GRUB 2 菜单

    # yum install os-prober # grub2-mkconfig -o /boot/grub2/grub.cfg

  8. CSS“反转”为LESS

    LESS(官网在此:http://lesscss.net/)的魅力相信大家都已明了,个人认为它最大的魅力在于能够清晰的展现嵌套关系. 针对现有的项目,它的应用难点主要在于—— 何时转换为css,即是否 ...

  9. MapReduce:详解Shuffle过程(转)

    /** * author : 冶秀刚 * mail     : dennyy99@gmail.com */ Shuffle过程是MapReduce的核心,也被称为奇迹发生的地方.要想理解MapRedu ...

  10. SRAM的读写操作

    自己写的SRAM的程序,主要在于实用性,适应工作的工程需要.使用芯片为: 芯片时序图为: 代码: /********************************Copyright********* ...