题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3572


算是细节题了吧。。

  构出虚树,考虑z正反DP两次求出虚树中每个点最近的议事处是哪一个点,然后枚举虚树中的每一条边${X->Y}$,对于两点间在原树中的路径,显然存在一个分界点使得自分界点之上的所有点归最靠近$X$的议事处管辖,之下的点归最靠经$Y$的议事处管辖,还有一些没有考虑过的点,另外统计一下即可。


 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cstdlib>
#include<cmath>
#include<cstring>
using namespace std;
#define maxn 310000
#define llg long long
#define yyj(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
llg n,m,f[maxn][],deep[maxn],dfn[maxn],cnt,size[maxn],s[maxn],top;
llg a[maxn],b[maxn],bel[maxn],c[maxn],rem[maxn],ans[maxn]; vector<llg>g[maxn]; bool cmp(llg x,llg y) {return dfn[x]<dfn[y];} void link(llg x,llg y){g[x].push_back(y);} void dfs(llg x,llg fa)
{
dfn[x]=++cnt;
llg w=g[x].size(),v;
size[x]=;
for (llg i=;i<w;i++)
{
v=g[x][i];
if (v==fa) continue;
deep[v]=deep[x]+;
f[v][]=x;
dfs(v,x);
size[x]+=size[v];
}
} void make_f()
{
for (llg j=;j<=;j++)
for (llg i=;i<=n;i++)
f[i][j]=f[f[i][j-]][j-];
} llg lca(llg x,llg y)
{
if (deep[x]<deep[y]) swap(x,y);
for (llg i=;i>=;i--)
if (deep[f[x][i]]>=deep[y])
x=f[x][i];
if (x==y) return x;
for (llg i=;i>=;i--)
if (f[x][i]!=f[y][i])
{
x=f[x][i];
y=f[y][i];
}
return f[x][];
} llg dis(llg x,llg y) {return deep[x]+deep[y]-*deep[lca(x,y)];} void init()
{
cin>>n;
llg x,y;
for (llg i=;i<n;i++)
{
scanf("%lld%lld",&x,&y);
g[x].push_back(y),g[y].push_back(x);
}
deep[]=;
dfs(,-);
make_f();
} void build_tree()
{
cnt=top=;
sort(a+,a+m+,cmp);
if (bel[]!=) s[++top]=;
for (llg i=;i<=m;i++)
{
llg x=a[i],fa=;
while (top)
{
fa=lca(s[top],x);
if (top> && deep[fa]<deep[s[top-]])
{
link(s[top-],s[top]);
top--;
}
else
if (deep[fa]<deep[s[top]]){ link(fa,s[top--]); break;}
else
break; }
if (s[top]!=fa) s[++top]=fa;
s[++top]=x;
}
while (--top) link(s[top],s[top+]);
} void dfs1(llg x,llg fa)
{
c[++cnt]=x;
rem[x]=size[x];
llg w=g[x].size(),v;
for (llg i=;i<w;i++)
{
v=g[x][i];
dfs1(v,x);
if (v==fa) continue;
if (!bel[v]) continue;//why
llg d1=dis(bel[v],x),d2=dis(bel[x],x);
if ((d1==d2 && bel[v]<bel[x]) || (d1<d2) || !bel[x]) bel[x]=bel[v];
}
} void dfs2(llg x,llg fa)
{
llg w=g[x].size(),v;
for (llg i=;i<w;i++)
{
v=g[x][i];
if (v==fa) continue;
llg d1=dis(bel[x],v),d2=dis(bel[v],v);
if ((d1==d2 && bel[v]>bel[x]) || (d1<d2) || !bel[v])
bel[v]=bel[x];
dfs2(v,x);
}
} void work(llg x,llg y)
{
llg son=y,mid=y;
for (llg i=;i>=;i--)
if (deep[f[son][i]]>deep[x]) son=f[son][i];
rem[x]-=size[son];
if (bel[x]==bel[y]) {ans[bel[x]]+=size[son]-size[y]; return;}
for (llg i=;i>=;i--)
{
llg ne=f[mid][i];
if (deep[ne]<=deep[x]) continue;
llg d1=dis(bel[x],ne),d2=dis(bel[y],ne);
if (d1>d2 || (d1==d2 && bel[y]<bel[x])) mid=ne;
}
ans[bel[x]]+=size[son]-size[mid];
ans[bel[y]]+=size[mid]-size[y];
} int main()
{
yyj("tree");
init();
llg T; cin>>T;
for (llg i=;i<=n;i++)
{
while (!g[i].empty()) g[i].pop_back();
//std::vector(c).swap(vec);
}
while (T--)
{
scanf("%lld",&m);
for (llg i=;i<=m;i++)
{
scanf("%lld",&a[i]);
b[i]=a[i]; bel[a[i]]=a[i];
}
build_tree();
dfs1(,-); dfs2(,-);
for (llg i=;i<=cnt;i++)
{
llg w=g[c[i]].size();
llg la=-;
for (llg j=;j<w;j++)
{
if (g[c[i]][j]==la) continue;
la=g[c[i]][j];
work(c[i],g[c[i]][j]);
}
}
for (llg i=;i<=cnt;i++) ans[bel[c[i]]]+=rem[c[i]];
for (llg i=;i<=m;i++) printf("%lld ",ans[b[i]]);
printf("\n");
for (llg i=;i<=cnt;i++)
{
ans[c[i]]=bel[c[i]]=rem[c[i]]=;
while (!g[c[i]].empty()) g[c[i]].pop_back();
}
}
return ;
}

【BZOJ】3572: [Hnoi2014]世界树的更多相关文章

  1. BZOJ 3572: [Hnoi2014]世界树

    BZOJ 3572: [Hnoi2014]世界树 标签(空格分隔): OI-BZOJ OI-虚数 OI-树形dp OI-倍增 Time Limit: 20 Sec Memory Limit: 512 ...

  2. bzoj 3572: [Hnoi2014]世界树 虚树 && AC500

    3572: [Hnoi2014]世界树 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 520  Solved: 300[Submit][Status] ...

  3. bzoj 3572 [Hnoi2014]世界树(虚树+DP)

    3572: [Hnoi2014]世界树 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 645  Solved: 362[Submit][Status] ...

  4. bzoj 3572 [Hnoi2014]世界树——虚树

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3572 关于虚树:https://www.cnblogs.com/zzqsblog/p/556 ...

  5. BZOJ 3572: [Hnoi2014]世界树 虚树 树形dp

    https://www.lydsy.com/JudgeOnline/problem.php?id=3572 http://hzwer.com/6804.html 写的时候参考了hzwer的代码,不会写 ...

  6. bzoj 3572: [Hnoi2014]世界树 虚树

    题目: Description 世界树是一棵无比巨大的树,它伸出的枝干构成了整个世界.在这里,生存着各种各样的种族和生灵,他们共同信奉着绝对公正公平的女神艾莉森,在他们的信条里,公平是使世界树能够生生 ...

  7. BZOJ 3572 [HNOI2014]世界树 (虚树+DP)

    题面:BZOJ传送门 洛谷传送门 题目大意:略 细节贼多的虚树$DP$ 先考虑只有一次询问的情况 一个节点$x$可能被它子树内的一个到x距离最小的特殊点管辖,还可能被管辖fa[x]的特殊点管辖 跑两次 ...

  8. BZOJ 3572: [Hnoi2014]世界树 [虚树 DP 倍增]

    传送门 题意: 一棵树,多次询问,给出$m$个点,求有几个点到给定点最近 写了一晚上... 当然要建虚树了,但是怎么$DP$啊 大爷题解传送门 我们先求出到虚树上某个点最近的关键点 然后枚举所有的边$ ...

  9. 【BZOJ】3572: [Hnoi2014]世界树 虚树+倍增

    [题意]给定n个点的树,m次询问,每次给定ki个特殊点,一个点会被最近的特殊点控制,询问每个特殊点控制多少点.n,m,Σki<=300000. [算法]虚树+倍增 [题解]★参考:thy_asd ...

随机推荐

  1. Different between MB SD Connect Compact 5 and MB SD C4 Star Diagnostic Tool

    MB SD C4 Star Diagnostic Tool is the professional MB Star Diagnostic Tools for benz cars and trucks. ...

  2. python 3.7 方向键乱码

    原因是缺少安装包libreadline-dev 第一步安装libreadline-dev包:sudo apt-get install libreadline-dev(centos安装:yum -y i ...

  3. 简单的图像显著性区域特征提取方法-----opencv实现LC,AC,FT

    https://blog.csdn.net/cai13160674275/article/details/72991049?locationNum=7&fps=1 四种简单的图像显著性区域特征 ...

  4. Prometheus监控学习笔记之全面学习Prometheus

    0x00 概述 Prometheus是继Kubernetes后第2个正式加入CNCF基金会的项目,容器和云原生领域事实的监控标准解决方案.在这次分享将从Prometheus的基础说起,学习和了解Pro ...

  5. LSTM算法原理理解

    神经网络 模拟人类大脑神经网络结构,每个神经元和其他的神经元相互连接,当它兴奋的时候会向相连的神经元发送化学物质,从而改变神经元的电位,当神经元的电位超过阈值,它会被激活,向其他神经元发送化学物质.其 ...

  6. 一键PHP/JAVA安装工具

    OneinStack是一键PHP/JAVA安装脚本工具,包含lnmp,lamp,lnmpa,ltmp,lnmh,MySQL,PostgreSQL,MongoDB等 建议使用 PHP7.1+MYSQL5 ...

  7. ssh 工具

    ssh 使用 rsa key 实现无密码访问 server A 要用 rsa key 验证的方式访问 server B 在A上创建/root/.ssh/目录 > chmod -R 700 /ro ...

  8. JSch : channel never closed or EOF 通道未关闭

    最近,我们的项目在开发远程节点管理的时候,使用了jsch库.在测试的时候发现有个节点在cmd执行完成之后,channel.isClosed()一直都是false,导致请求无法返回,但是其它有些节点就没 ...

  9. 11.2.0.4 sql*loader/oci direct load导致kpodplck wait before retrying ORA-54

    昨天晚上9点多,有个环境开发说特别慢,早上上去看下了,如下: 导致性能的是一个统计的sql执行计划走错了,主要不是因为kpodplck wait before retrying ORA-54,不过这个 ...

  10. vue 起步

    vue 官网 目前最火的前端框架当属Vue.js了,很多使用过vue的程序员这样评价它,“vue.js兼具angular.js和react.js的优点,并剔除了它们的缺点”.授予了这么高的评价的vue ...