解题: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号城市 ...
随机推荐
- C# httpRequest Soap请求
一般添加web服务引用是.NET用代理类模式 创建SOAP请求代理类,代理类是.NET开发工具VS自动给你生成. 下面用一般HTTP的模式有时候可能更合适,原理是构造SOAP请求的XML后POST过去 ...
- 2017-2018 Exp6 信息搜集与漏洞扫描 20155214
目录 Exp6 信息搜集与漏洞扫描 实验内容 信息收集 漏洞扫描 知识点 Exp6 信息搜集与漏洞扫描 收集渗透目标的情报是最重要的阶段.如果收集到有用的情报资料的话,可以大大提高对渗透测试的成功性. ...
- 20155222卢梓杰 实验九 Web安全基础
实验九 Web安全基础 今天不多bb,打开webgoat就是干好吧 1.简单字符串sql注入 可以看到这个实验说明是 "下表允许用户查看其信用卡号码.尝试插入一个SQL字符串,以显示所有信用 ...
- AWK处理数组
转自ChinaUnix论坛,感谢作者整理. 在文本处理的工作中,awk的数组是必不可少的工具,在这里,同样以总结经验和教训的方式和大家分享下我的一些学习心得,如有错误的地方,请大家指正和补充. awk ...
- Android 模拟输入那点事
因工作原因,需要用到模拟输入这个东东,查阅了一些资料,实现方式有多种,我大概分为两类,命令行类和程序类. 命令行类包括自动化测试组件monkeyrunner,getevent/setevent命令,i ...
- 【转载】SSD断电保护原理
异常掉电的隐患 若没有合理的掉电保护机制,而异常掉电的发生又不可避免,当发生异常掉电,会引发很多问题. (1)丢盘 异常掉电,会使得映射表来不及保存,丢失逻辑地址到物理地址的映射,待重新上电后,SSD ...
- asp.net web api参数
翻译自:http://www.c-sharpcorner.com/article/parameter-binding-in-asp-net-web-api/ 主要自己学习下,说是翻译,主要是把文章的意 ...
- HTML 列表实例
41.无序列表本例演示无序列表.<h4>一个无序列表</h4><ul> <li>咖啡</li> <li>茶</li> ...
- zabbix设置微信报警的配置过程
zabbix设置微信报警的配置过程 转发:https://blog.csdn.net/qq_31613055/article/details/78831607 微信企业号的申请 注册的地址https: ...
- 调试OV2735总结
调试找到的问题: 1:开始调试的时候因为之前的工程师原理图和BOM出错,导致本来是2.8V电压的焊接的是1.8V的LDO所以这个是第一个问题 2:因为FAE反应说sensor没有反应I2C没有通信,所 ...