链剖。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxv 300500
#define maxe 600500
using namespace std;
int n,a[maxv],x,y,nume=,g[maxv];
int w[maxv],fath[maxv],dis[maxv],son[maxv],size[maxv],top[maxv],tot=;
int ls[maxv<<],rs[maxv<<],lazy[maxv<<],root,cnt=,ans[maxv];
struct edge
{
int v,nxt;
}e[maxe];
void addedge(int u,int v)
{
e[++nume].v=v;
e[nume].nxt=g[u];
g[u]=nume;
}
void dfs1(int x)
{
size[x]=;son[x]=;
for (int i=g[x];i;i=e[i].nxt)
{
int v=e[i].v;
if (v!=fath[x])
{
fath[v]=x;
dis[v]=dis[x]+;
dfs1(v);
size[x]+=size[v];
if (size[v]>size[son[x]])
son[x]=v;
}
}
}
void dfs2(int x,int father)
{
top[x]=father;w[x]=++tot;
if (son[x]) dfs2(son[x],father);
for (int i=g[x];i;i=e[i].nxt)
{
int v=e[i].v;
if ((v!=fath[x]) && (v!=son[x]))
dfs2(v,v);
}
}
void build(int &now,int left,int right)
{
now=++cnt;lazy[now]=;
if (left==right) return;
int mid=(left+right)>>;
build(ls[now],left,mid);
build(rs[now],mid+,right);
}
void modify(int now,int left,int right,int l,int r)
{
if ((left==l) && (right==r))
{
lazy[now]++;
return;
}
int mid=(left+right)>>;
if (r<=mid) modify(ls[now],left,mid,l,r);
else if (l>=mid+) modify(rs[now],mid+,right,l,r);
else
{
modify(ls[now],left,mid,l,mid);
modify(rs[now],mid+,right,mid+,r);
}
}
void work(int x)
{
int p,q,f1,f2;
p=a[x];q=a[x+];
f1=top[p];f2=top[q];
while (f1!=f2)
{
if (dis[f1]<dis[f2])
{
swap(p,q);
swap(f1,f2);
}
modify(root,,n,w[f1],w[p]);
p=fath[f1];f1=top[p];
}
if (dis[p]>dis[q]) swap(p,q);
modify(root,,n,w[p],w[q]);
}
int ask(int now,int left,int right,int p)
{
if ((left==right) && (left==p))
return lazy[now];
int mid=(left+right)>>;
if (p<=mid) return ask(ls[now],left,mid,p)+lazy[now];
else return ask(rs[now],mid+,right,p)+lazy[now];
}
int main()
{
scanf("%d",&n);
for (int i=;i<=n;i++)
scanf("%d",&a[i]);
for (int i=;i<=n-;i++)
{
scanf("%d%d",&x,&y);
addedge(x,y);
addedge(y,x);
}
dfs1();
dfs2(,);
build(root,,n);
for (int i=;i<=n-;i++)
work(i);
for (int i=;i<=n;i++)
{
int now=ask(root,,n,w[a[i]]);
if (i!=) now--;
ans[a[i]]=now;
}
for (int i=;i<=n;i++)
printf("%d\n",ans[i]);
return ;
}

BZOJ 3631 松鼠的新家的更多相关文章

  1. bzoj 3631 松鼠的新家 (树链剖分)

    链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3631 思路: 直接用树链剖分求每一次运动,因为这道题只需要区间增添,单点求值,没必要用线段 ...

  2. BZOJ - 3631 松鼠的新家 (树链剖分)

    题目链接 树链剖分基础题,路径权值修改+差分 #include<bits/stdc++.h> using namespace std; typedef long long ll; ; in ...

  3. BZOJ 3631 松鼠的新家 树上差分

    我猜会有智障说直接链剖+线段树…(希望没有) From RYC's 课件 然鹅我并不反对树剖...我是智障...QAQ 好吧还是树上差分:设 a[i]=u.a[i+1]=v ++w[u],++w[v] ...

  4. BZOJ 3631 松鼠的新家 - 树链剖分 / 树上差分

    传送门 分析: 树链剖分:x->y,将x到y的路径加一,并将x端点的答案-1,最后统计答案. 树上差分:x->y,x+1,y+1,lca-1,fa[lca]-1,并将x打上标记,最后统计前 ...

  5. BZOJ 3631: [JLOI2014]松鼠的新家( 树链剖分 )

    裸树链剖分... ------------------------------------------------------------------- #include<bits/stdc++ ...

  6. Bzoj 3631: [JLOI2014]松鼠的新家(树链剖分+线段树)

    3631: [JLOI2014]松鼠的新家 Time Limit: 10 Sec Memory Limit: 128 MB Description 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个 ...

  7. BZOJ 3631 【JLOI2014】 松鼠的新家

    Description 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他居然真的住在"树&q ...

  8. bzoj 3631: [JLOI2014]松鼠的新家

    Description 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他居然真的住在"树&q ...

  9. 洛谷 P3258 BZOJ 3631 [JLOI2014]松鼠的新家

    题目描述 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他居然真的住在”树“上. 松鼠想邀请小熊维尼前 ...

随机推荐

  1. 如何说服你的老板必须使用APM?

    APM研究院 2015/04/24 16:56 2013年,某权威机构提供一组数据显示:亚马逊每100毫秒延迟会使销售额下降1%:雅虎一秒钟服务器延迟导致收入下降2.8%:谷歌搜索结果页面放缓100毫 ...

  2. 由浅入深了解Thrift之客户端连接池化续

    前文<由浅入深了解Thrift之客户端连接池化>中我们已经实现了服务调用端 连接的池化,实现的过于简陋,离实际的项目运用还很遥远.本文将在进一步改造,主要是两方面:1.服务端如何注册多个服 ...

  3. iOS导航栏-关闭半透明

    self.navigationController.navigationBar.translucent = NO;

  4. [转载] ACE 组播校验和出错问题解决

    源地址:http://yuanmuqiuyu2000.blog.sohu.com/140904942.html 使用ACE框架写了个组播简单的测试工具,但是测试过程中,总是发现udp校验和出错的信息. ...

  5. SQL server 为多个表添加新的列

    作为一名.NET未入门的程序员,第一次发随笔. 前不久参与写的公司业务程序,目前这个程序的后期维护修复漏洞工作由我来负责.由于业务关系重大,每一步对程序代码的操作都非常谨慎,一旦操作失误,造成的损失和 ...

  6. Map中如何把没有定义操作符<的类作为key

    Map中如何把没有定义操作符<的类作为key 其实,为了实现快速查找,map内部本身就是按序存储的(比如红黑树).在我们插入<key, value>键值对时,就会按照key的大小顺序 ...

  7. IE9 JSON未定义

    原文:http://social.msdn.microsoft.com/Forums/ie/en-US/fc41127c-0243-4d2e-8e7c-2b311f12e390/ie9-json-no ...

  8. Android核心分析之十八Android电话系统之RIL-Java

    Android RIL-Java 123.jpg (2.09 KB, 下载次数: 1) 下载附件  保存到相册 2012-3-21 10:47 上传   RIL-Java在本质上就是一个RIL代理,起 ...

  9. css3:target页内跳转

    :target 用于选取当前活动的目标元素 <!DOCTYPE html> <html> <head lang="en"> <meta c ...

  10. C++:主要几种排序算法及其复杂度

     常见排序算法稳定性和复杂度分析快速简记以及转载 分类: 算法 2012-02-07 22:18 399人阅读 评论(1) 收藏 举报 算法mergeshell http://blogold.chin ...