解题:HNOI 2014 世界树
首先建虚树
DFS求虚树上每个点所属的点和到它所属点的距离,然后在=考虑虚树所有的边(对应原树一条链)。如果两个端点所属节点不同就倍增出分界点统计答案,否则不用管(之后会统计到的);注意根节点特殊讨论。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=,K=,inf=1e9;
int T,n,m,t1,t2,cnt,tot,top;
int p[N],noww[N],goal[N];
int siz[N],dep[N],dfn[N],upt[N][K],oth[N][K];
int a[N],b[N],c[N],d[N],bel[N],stk[N],ans[N];
bool cmp(int a,int b)
{
return dfn[a]<dfn[b];
}
void Link(int f,int t)
{
noww[++cnt]=p[f];
goal[cnt]=t,p[f]=cnt;
}
void DFS(int nde,int fth,int dth)
{
siz[nde]=,dep[nde]=dth;
upt[nde][]=fth,dfn[nde]=++tot;
for(int i=;i<=&&upt[nde][i-];i++)
upt[nde][i]=upt[upt[nde][i-]][i-];
for(int i=p[nde];i;i=noww[i])
if(goal[i]!=fth)
DFS(goal[i],nde,dth+),siz[nde]+=siz[goal[i]];
}
void Calc(int nde,int fth)
{
oth[nde][]=siz[fth]-siz[nde];
for(int i=;i<=&&upt[nde][i-];i++)
oth[nde][i]=oth[nde][i-]+oth[upt[nde][i-]][i-];
for(int i=p[nde];i;i=noww[i])
if(goal[i]!=fth) Calc(goal[i],nde);
}
int LCA(int x,int y)
{
if(dep[x]<dep[y]) swap(x,y);
for(int i=;dep[x]!=dep[y];i--)
if(dep[upt[x][i]]>=dep[y]) x=upt[x][i];
if(x==y) return x;
for(int i=;~i;i--)
if(upt[x][i]!=upt[y][i])
x=upt[x][i],y=upt[y][i];
return upt[x][];
}
int Dis(int x,int y)
{
int lca=LCA(x,y);
return dep[x]+dep[y]-*dep[lca];
}
bool Check(int a,int b,int d)
{
return c[a]+d<c[b]||(c[a]+d==c[b]&&bel[a]<bel[b]);
}
void Insert(int nde)
{
if(!top) stk[++top]=nde;
else
{
int lca=LCA(nde,stk[top]);
if(lca!=stk[top])
{
while(top>&&dfn[lca]<=dfn[stk[top-]])
Link(stk[top-],stk[top]),top--;
if(dfn[lca]<dfn[stk[top]])
Link(lca,stk[top]),top--;
if(lca!=stk[top])
stk[++top]=lca;
}
stk[++top]=nde;
}
}
int Upt(int nde,int gal)
{
int ret=;
for(int i=;~i;i--)
if(gal&(<<i))
ret+=oth[nde][i],nde=upt[nde][i];
return ret;
}
void DFS1(int nde)
{
if(!bel[nde]) c[nde]=inf;
for(int i=p[nde];i;i=noww[i])
{
int g=goal[i],dd=dep[g]-dep[nde]; DFS1(g);
if(Check(g,nde,dd)) c[nde]=c[g]+dd,bel[nde]=bel[g];
}
}
void DFS2(int nde,int lst)
{
int dd=dep[nde]-dep[lst];
if(lst&&Check(lst,nde,dd))
c[nde]=c[lst]+dd,bel[nde]=bel[lst];
for(int i=p[nde];i;i=noww[i])
DFS2(goal[i],nde),d[nde]+=d[goal[i]];
if(!lst) ans[bel[nde]]+=n-d[nde];
else if(bel[nde]!=bel[lst])
{
int cut=c[nde]+c[lst]+dd,chk=cut%||bel[nde]<bel[lst],tmp;
tmp=Upt(nde,cut/-c[nde]-(chk^));
ans[bel[nde]]+=siz[nde]-d[nde]+tmp,d[nde]=siz[nde]+tmp;
}
}
void Clear(int nde)
{
for(int i=p[nde];i;i=noww[i])
Clear(goal[i]);
bel[nde]=p[nde]=c[nde]=d[nde]=;
}
int main()
{
scanf("%d",&n);
for(int i=;i<n;i++)
scanf("%d%d",&t1,&t2),Link(t1,t2),Link(t2,t1);
DFS(,,),Calc(,),memset(p,,sizeof p);
scanf("%d",&T);
while(T--)
{
scanf("%d",&m),cnt=top=;
for(int i=;i<=m;i++) scanf("%d",&a[i]),b[i]=a[i];
sort(a+,a++m,cmp); stk[top=]=a[],bel[a[]]=a[];
for(int i=;i<=m;i++) Insert(a[i]),bel[a[i]]=a[i];
while(top>) Link(stk[top-],stk[top]),top--;
DFS1(stk[]),DFS2(stk[],);
for(int i=;i<=m;i++)
printf("%d ",ans[b[i]]),ans[b[i]]=;
Clear(stk[]),puts("");
}
return ;
}
解题:HNOI 2014 世界树的更多相关文章
- 数据结构(虚树,动态规划):HNOI 2014 世界树
Hnoi2014 世界树 Description 世界树是一棵无比巨大的树,它伸出的枝干构成了整个世界.在这里,生存着各种各样的种族和生灵,他们共同信奉着绝对公正公平的女神艾莉森,在他们的信条里,公平 ...
- [HNOI 2014]世界树
Description 题库链接 给出一棵 \(n\) 个节点的树, \(q\) 次询问,每次给出 \(k\) 个关键点.树上所有的点会被最靠近的关键点管辖,若距离相等则选编号最小的那个.求每个关键点 ...
- HNOI 2014 米特运输(图论)
HNOI 2014 米特运输 题目大意 给一棵树,每个点有自己的权值,要求更改一些点的权值,使得整棵树满足两个条件: 同一个父亲的所有子节点权值相同 父节点的取值为所有子节点的和 答案输出最少要更改的 ...
- HNOI 2014
D1T1:画框 frame 题意:给你两个n阶正整数方阵,请你求最大的\( \sum_{i = 1}^{n} A_{i, p_i}\times \sum_{i = 1}^{n} B_{i, p_i} ...
- 图论(KM算法,脑洞题):HNOI 2014 画框(frame)
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABPoAAANFCAIAAABtIwXVAAAgAElEQVR4nOydeVxTV/r/n9ertaJEC4
- [HNOI 2014]画框
Description 题库链接 \(T\) 组询问,每组询问给你个 \(2\times N\) 的带权二分图,两个权值 \(a,b\) ,让你做匹配使得 \[\sum a\times \sum b\ ...
- [HNOI 2014]江南乐
Description 题库链接 给你指定一个数 \(f\) ,并给你 \(T\) 组游戏,每组有 \(n\) 堆石子, \(A,B\) 两人轮流对石子进行操作,每次你可以选择其中任意一堆数量不小于 ...
- [HNOI 2014]道路堵塞
Description A国有N座城市,依次标为1到N.同时,在这N座城市间有M条单向道路,每条道路的长度是一个正整数.现在,A国 交通部指定了一条从城市1到城市N的路径,并且保证这条路径的长度是所有 ...
- [HNOI 2014]米特运输
Description 米特是D星球上一种非常神秘的物质,蕴含着巨大的能量.在以米特为主要能源的D星上,这种米特能源的运输和储 存一直是一个大问题.D星上有N个城市,我们将其顺序编号为1到N,1号城市 ...
随机推荐
- 20155323刘威良《网络对抗》Exp4 恶意代码分析
20155323刘威良<网络对抗>Exp4 恶意代码分析 实践目标 1是监控你自己系统的运行状态,看有没有可疑的程序在运行. 2是分析一个恶意软件,就分析Exp2或Exp3中生成后门软件: ...
- metasploit-smb扫描获取系统信息
1.msfconsle 2.use auxiliary/scanner/smb/smb_version 3. msf auxiliary(smb_version) > set RHOSTS 17 ...
- 微信小程序之页面传值(路由、页面栈、globalData、缓存)
1. 通过url带参数传递 1.1 固定参数传递 例如,从 list 页面到 detail 页面, 传递一个或多个固定值 list页面传值: <!--pages/list/list.js--&g ...
- Spring+SpringMVC+MyBatis整合基础篇
基础篇 Spring+SpringMVC+MyBatis+easyUI整合基础篇(一)项目简介 Spring+SpringMVC+MyBatis+easyUI整合基础篇(二)牛刀小试 Spring+S ...
- Configuration Section Designer for VS2017
Configuration Section Designer是在Visual Studio中设计符合.Net配置体系配置文件和代码的神器.然而,它的源码已经很久不维护了.现在在新的VS2017中无法使 ...
- 【LeetCode】数组--合并区间(56)
写在前面 老粉丝可能知道现阶段的LeetCode刷题将按照某一个特定的专题进行,之前的[贪心算法]已经结束,虽然只有三个题却包含了简单,中等,困难这三个维度,今天介绍的是第二个专题[数组] 数组( ...
- 一个Boss直聘机器人, 自动回复发简历
goBoss 基佬github地址 这是基于go语言编写的一款boss直聘机器人软件(牛人版).附上Python版本, 无需配置Go环境, 我会提供windows和macos的可执行程序.不喜勿喷O( ...
- 32bit 天堂2脚本修改资料大全【客户端+服务端】
该资料夹中所有教程资料全部适合天堂2初章32位服务端的脚本修改,已经1.2章相关客户端的修改. https://pan.baidu.com/s/1RuGMFNgERd2JMYQpdceQwg 提取码: ...
- sql注入语句整理
1.判断有无注入点; and 1=1 and 1=2 2.猜表一般的表的名称无非是admin adminuser user pass password 等..and 0<>(select ...
- PHP Laravel 连接并访问数据库
第一次连接数据库 数据库配置位于config/database.php数据库用户名及密码等敏感信息位于.env文件创建一个测试表laravel_course <?php namespace Ap ...