[BZO3572][HNOI2014]世界树:虚树+倍增
分析
思维难度几乎为\(0\)的虚树码农(并不)题。
代码
#include <bits/stdc++.h>
#define rin(i,a,b) for(register int i=(a);i<=(b);++i)
#define irin(i,a,b) for(register int i=(a);i>=(b);--i)
#define trav(i,a) for(register int i=head[a];i;i=e[i].nxt)
#define itrav(i,a) for(register int i=ihead[a];i;i=ie[i].nxt)
typedef long long LL;
using std::cin;
using std::cout;
using std::endl;
inline int read(){
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
while(isdigit(ch)){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
const int MAXN=3e5+5;
int n,q,ecnt,head[MAXN];
int tot,id[MAXN],num[MAXN],len,st[MAXN<<1][21],pos[MAXN];
int dep[MAXN],siz[MAXN],anc[MAXN][21];
int m,mm,h[MAXN<<1],hh[MAXN],top,sta[MAXN];
int iecnt,ihead[MAXN];
int ans[MAXN];
bool isc[MAXN];
struct Edge{
int to,nxt;
}e[MAXN<<1];
inline void add_edge(int bg,int ed){
++ecnt;
e[ecnt].to=ed;
e[ecnt].nxt=head[bg];
head[bg]=ecnt;
}
void dfs1(int x,int pre,int depth){
id[x]=++tot;
num[tot]=x;
st[++len][0]=id[x];
pos[x]=len;
dep[x]=depth;
siz[x]=1;
anc[x][0]=pre;
trav(i,x){
int ver=e[i].to;
if(ver==pre) continue;
dfs1(ver,x,depth+1);
st[++len][0]=id[x];
siz[x]+=siz[ver];
}
}
void buildst(){
int lim=log2(len);
rin(i,1,lim) rin(j,1,len-(1<<i)+1)
st[j][i]=std::min(st[j][i-1],st[j+(1<<(i-1))][i-1]);
}
void buildanc(){
rin(i,1,20) rin(j,1,n)
anc[j][i]=anc[anc[j][i-1]][i-1];
}
inline int lca(int x,int y){
x=pos[x],y=pos[y];
if(x>y) std::swap(x,y);
int lim=log2(y-x+1);
return num[std::min(st[x][lim],st[y-(1<<lim)+1][lim])];
}
inline bool cmp(int x,int y){
return id[x]<id[y];
}
struct iedge{
int to,nxt;
}ie[MAXN];
inline void add_iedge(int bg,int ed){
++iecnt;
ie[iecnt].to=ed;
ie[iecnt].nxt=ihead[bg];
ihead[bg]=iecnt;
}
void build_itree(){
std::sort(h+1,h+m+1,cmp);
rin(i,2,mm) h[++m]=lca(h[i-1],h[i]);
h[++m]=1;
std::sort(h+1,h+m+1,cmp);
m=std::unique(h+1,h+m+1)-h-1;
top=0;
rin(i,1,m){
while(top&&id[h[i]]>id[sta[top]]+siz[sta[top]]-1) add_iedge(sta[top-1],sta[top]),--top;
sta[++top]=h[i];
}
while(top>1) add_iedge(sta[top-1],sta[top]),--top;
--top;
}
struct ctrl{
int pos,dis;
inline friend bool operator < (ctrl A,ctrl B){
return A.dis==B.dis?A.pos<B.pos:A.dis<B.dis;
}
}c[MAXN];
void dfs2(int x){
if(isc[x]) c[x]=(ctrl){x,0};
else c[x]=(ctrl){0,(int)1e9};
itrav(i,x){
int ver=ie[i].to;
dfs2(ver);
c[x]=std::min(c[x],(ctrl){c[ver].pos,c[ver].dis+dep[ver]-dep[x]});
}
}
void dfs3(int x,int pre){
if(pre) c[x]=std::min(c[x],(ctrl){c[pre].pos,c[pre].dis+dep[x]-dep[pre]});
itrav(i,x){
int ver=ie[i].to;
dfs3(ver,x);
}
}
inline int getveranc(int x,int pre){
int ret=x;
irin(i,20,0)
if(dep[anc[ret][i]]>dep[pre])
ret=anc[ret][i];
return ret;
}
inline int climb(int x,int y){
int ret=x,tt=0;
while(y){
if(y&1) ret=anc[ret][tt];
++tt;
y>>=1;
}
return ret;
}
void dfs4(int x,int pre){
ans[c[x].pos]+=siz[x];
itrav(i,x){
int ver=ie[i].to,veranc=getveranc(ver,x);
dfs4(ver,x);
ans[c[x].pos]-=siz[veranc];
if(c[x].pos==c[ver].pos)
ans[c[x].pos]+=siz[veranc]-siz[ver];
else{
int mid=0;
if((dep[ver]-dep[x]+c[ver].dis-c[x].dis)&1) mid=dep[ver]-(((dep[x]+dep[ver]+c[ver].dis-c[x].dis)>>1)+1);
else if(c[x].pos<c[ver].pos) mid=dep[ver]-(((dep[x]+dep[ver]+c[ver].dis-c[x].dis)>>1)+1);
else mid=dep[ver]-((dep[x]+dep[ver]+c[ver].dis-c[x].dis)>>1);
mid=climb(ver,mid);
ans[c[x].pos]+=siz[veranc]-siz[mid];
ans[c[ver].pos]+=siz[mid]-siz[ver];
}
}
}
/*
const int MAXN=3e5+5;
int n,q,ecnt,head[MAXN];
int tot,id[MAXN],num[MAXN],len,st[MAXN<<1][21],pos[MAXN];
int dep[MAXN],siz[MAXN],anc[MAXN][21];
int m,mm,h[MAXN<<1],hh[MAXN],top,sta[MAXN];
int iecnt,ihead[MAXN];
int ans[MAXN];
bool isc[MAXN];
*/
void clear_itree(){
iecnt=0;
rin(i,1,m) ihead[h[i]]=ans[h[i]]=0,isc[h[i]]=false;
}
int main(){
n=read();
rin(i,2,n){
int u=read(),v=read();
add_edge(u,v);
add_edge(v,u);
}
dfs1(1,0,1);
buildst();
buildanc();
q=read();
while(q--){
m=mm=read();
rin(i,1,m) h[i]=hh[i]=read(),isc[h[i]]=true;
build_itree();
dfs2(1);
dfs3(1,0);
dfs4(1,0);
rin(i,1,mm) printf("%d ",ans[hh[i]]);
putchar('\n');
clear_itree();
}
return 0;
}
[BZO3572][HNOI2014]世界树:虚树+倍增的更多相关文章
- 【BZOJ】3572: [Hnoi2014]世界树 虚树+倍增
[题意]给定n个点的树,m次询问,每次给定ki个特殊点,一个点会被最近的特殊点控制,询问每个特殊点控制多少点.n,m,Σki<=300000. [算法]虚树+倍增 [题解]★参考:thy_asd ...
- bzoj3572[Hnoi2014] 世界树 虚树+dp+倍增
[Hnoi2014]世界树 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 1921 Solved: 1019[Submit][Status][Dis ...
- BZOJ 3572: [Hnoi2014]世界树 [虚树 DP 倍增]
传送门 题意: 一棵树,多次询问,给出$m$个点,求有几个点到给定点最近 写了一晚上... 当然要建虚树了,但是怎么$DP$啊 大爷题解传送门 我们先求出到虚树上某个点最近的关键点 然后枚举所有的边$ ...
- 【BZOJ3572】[Hnoi2014]世界树 虚树
[BZOJ3572][Hnoi2014]世界树 Description 世界树是一棵无比巨大的树,它伸出的枝干构成了整个世界.在这里,生存着各种各样的种族和生灵,他们共同信奉着绝对公正公平的女神艾莉森 ...
- bzoj 3572: [Hnoi2014]世界树 虚树 && AC500
3572: [Hnoi2014]世界树 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 520 Solved: 300[Submit][Status] ...
- bzoj 3572 [Hnoi2014]世界树——虚树
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3572 关于虚树:https://www.cnblogs.com/zzqsblog/p/556 ...
- BZOJ 3572: [Hnoi2014]世界树 虚树 树形dp
https://www.lydsy.com/JudgeOnline/problem.php?id=3572 http://hzwer.com/6804.html 写的时候参考了hzwer的代码,不会写 ...
- 洛谷 P3233 [HNOI2014]世界树(虚树+dp)
题面 luogu 题解 数据范围已经告诉我们是虚树了,考虑如何在虚树上面\(dp\) 以下摘自hzwer博客: 构建虚树以后两遍dp处理出虚树上每个点最近的议事处 然后枚举虚树上每一条边,考虑其对两端 ...
- bzoj 3572: [Hnoi2014]世界树 虚树
题目: Description 世界树是一棵无比巨大的树,它伸出的枝干构成了整个世界.在这里,生存着各种各样的种族和生灵,他们共同信奉着绝对公正公平的女神艾莉森,在他们的信条里,公平是使世界树能够生生 ...
- BZOJ 3572 [HNOI2014]世界树 (虚树+DP)
题面:BZOJ传送门 洛谷传送门 题目大意:略 细节贼多的虚树$DP$ 先考虑只有一次询问的情况 一个节点$x$可能被它子树内的一个到x距离最小的特殊点管辖,还可能被管辖fa[x]的特殊点管辖 跑两次 ...
随机推荐
- http 中指定head中Content-Encoding属性为gzip 转换过程中的一些问题
项目环境: 对接的服务放在微服务中 提供接口给应用层调用 ,微服务放需要 接受参数 并且转换成压缩格式给 第三方服务 本来以为需要自己压缩,httpclint 中已经封装好了GzipCompressi ...
- 082、数据收集利器 cAdvisor (2019-04-30 周二)
参考https://www.cnblogs.com/CloudMan6/p/7683190.html cAdvisor 是google 开发的容器监控工具,下面我们开始安装和体验 cAdvisor ...
- MapUtils
一. package com.wang.utils; import java.util.HashMap; import java.util.Map; import java.util.Set; pub ...
- lnmp 环境搭建后,pathinfo 模式支持的配制。
ThinkPHP的四种URL模式:0(普通模式);1(PATHINFO模式);2(REWRITE模式);3(兼容模式) nginx需要PATHINFO模式,但需要更改nginx配置文件让其支持PATH ...
- linux下利用tcpdump抓包工具排查nginx获取客户端真实IP实例
一.nginx后端负载服务器的API在获取客户端IP时始终只能获取nginx的代理服务器IP,排查nginx配置如下 upstream sms-resp { server ; server ; } s ...
- kloxo增加了域名,怎么不能访问?如何重启web服务?
kloxo增加了域名,怎么不能访问?这是因为需要重新启动web服务. 有时候网站打不开,也可以尝试重启web服务. 重启web服务方法: 登录kloxo后台-->左边栏:服务器linux --& ...
- zencart前台小语种后台英文 导入批量表 前后台不显示产品的问题
admin\includes\init_includes\init_languages.php 前台小语种后台英文导致批量表导入后,前后台不显示产品的问题将红色部分修改成前台语言对应的值,前台语言对应 ...
- 安装BCG界面库 会导致vs2013qt库配置消失
安装BCG界面库 会导致vs2013qt库配置消失 安装BCG界面库 会导致vs2013qt库配置消失 安装BCG界面库 会导致vs2013qt库配置消失
- 现代操作系统第三版高清.pdf中文版免费下载
百度云盘:链接: https://pan.baidu.com/s/1i57XmxJ 密码: rmga
- rediscli命令
一.rediscli xxx 发送命令 二.进入客户端后的命令