【题解】P3258松鼠的新家
【题解】[P3258 JLOI2014]松鼠的新家
树链剖分板子题。
总结一点容易写错的地方吧:
if(d[top[u]]<d[top[v]]) swap(u,v);注意是\(top\)。- 在\(dfs2\)中,
if(e[t].to!=r[now]&&e[t].to!=son[now])注意\(r[now]\)而不是\(last\) 
#include<bits/stdc++.h>
using namespace std;
#define RP(t,a,b) for(register int t=(a),edd=(b);t<=edd;++t)
#define DRP(t,a,b) for(register int t=(a),edd=(b);t>=edd;--t)
#define ERP(t,a) for(register int t=head[a];t;t=e[t].nx)
#define Max(a,b) ((a)<(b)?(b):(a))
#define Min(a,b) ((a)<(b)?(a):(b))
#define midd register int mid=(l+r)>>1
#define TMP template < class ccf >
#define lowbit(x) ((x)&(-(x)))
TMP inline ccf qr(ccf b){
    char c=getchar();
    int q=1;
    ccf x=0;
    while(c<48||c>57)
	q=c==45?-1:q,c=getchar();
    while(c>=48&&c<=57)
	x=x*10+c-48,c=getchar();
    return q==-1?-x:x;
}
const int maxn=300005;
struct E{
    int to,nx;
}e[maxn<<1];
int cnt,n;
int head[maxn];
int mov[maxn];
int toseg[maxn];
int siz[maxn];
int son[maxn];
int top[maxn];
int r[maxn];
int d[maxn];
int seg[maxn];
inline void add(int to,int fr,bool f){
    e[++cnt]=(E){to,head[fr]};
    head[fr]=cnt;
    if(f)
	add(fr,to,0);
}
void dfs1(int now,int last){
    d[now]=d[last]+1;
    r[now]=last;
    siz[now]=1;
    ERP(t,now){
	if(e[t].to!=last){
	    dfs1(e[t].to,now);
	    siz[now]+=siz[e[t].to];
	    if(siz[e[t].to]>siz[son[now]])
		son[now]=e[t].to;
	}
    }
}
void dfs2(int now,int last){
    top[now]=last;
    toseg[now]=++toseg[0];
    if(son[now])
	dfs2(son[now],last);
    ERP(t,now)
	if(e[t].to!=r[now]&&e[t].to!=son[now])
	    dfs2(e[t].to,e[t].to);
}
inline void basic_add(int x,int tag){
    for(register int t=x;t<=n;t+=lowbit(t))seg[t]+=tag;
}
inline void inv_add(int l,int r,int tag){
    basic_add(l,tag);basic_add(r+1,-tag);
}
inline void upd(int u,int v){
    while(top[u]!=top[v]){
	if(d[top[u]]<d[top[v]]) swap(u,v);
	inv_add(toseg[top[u]],toseg[u],1);
	u=r[top[u]];
    }
    if(d[u]<d[v]) swap(u,v);
    inv_add(toseg[v],toseg[u],1);
}
int main(){
#ifndef ONLINE_JUDGE
    freopen("in.in","r",stdin);
    freopen("out.out","w",stdout);
#endif
    n=qr(1);
    RP(t,1,n) mov[t]=qr(1);
    for(register int t=2,t1,t2;t<=n;++t)
	t1=qr(1),t2=qr(1),add(t1,t2,1);
    dfs1(1,0);
    dfs2(1,1);
    RP(t,1,n-1)
	upd(mov[t],mov[t+1]);
    RP(t,2,n)
	inv_add(toseg[mov[t]],toseg[mov[t]],-1);
    RP(t,1,n){
	register int ans=0;
	for(register int i=toseg[t];i;i-=lowbit(i))
	    ans+=seg[i];
	printf("%d\n",ans);
    }
    return 0;
}
												
											【题解】P3258松鼠的新家的更多相关文章
- P3258 松鼠的新家
		
松鼠的新家 洛谷链接 尽管标签是省选/NOI-,但提交的通过率已经高到三分之一了. 但它仍旧是一个省选/NOI-的题. 大致题意就是按输入的顺序走一棵树,看每个节点经过多少次.问题就相当于把一条链上的 ...
 - 洛谷 P3258 松鼠的新家 题解
		
题面 貌似这道题暴力加玄学优化就可以AC? 下面是正解: 1.树链剖分: 我们在u到v之间都放一个糖果,可以将松鼠它家u到v的糖果数都加1.每一次将a[i]到a[i+1] (a数组是访问顺序)的节点加 ...
 - Luogu P3258 松鼠的新家(树链剖分+线段树/树状数组)
		
题面 题解 这种题目一看就是重链剖分裸题,还是区间修改,单点查询,查询之前在遍历时要记一个\(delta\),因为这一次的起点就是上一次的终点,不需要放糖,所以可以用\(BIT\)来写,但我写完\(m ...
 - 洛谷 [P3258] 松鼠的新家
		
树上差分 对于一条路径 \(u->v\) 来说,设 \(t=LCA(u,v)\) ,d[]为差分数组 ,则有 d[u]++;d[v]++;d[t]--;d[fa[t]]--; 注意:题目中所给的 ...
 - 洛谷P3258 松鼠的新家
		
树上差分 这应该是一道很简单的树上差分了..就是问每个点被覆盖了多少次. 要注意我们最后dfs后,要把除第一个节点以外的所有点的-1,因为有些点作为起点和终点覆盖了两次,按照题目意思是不用覆盖两次的. ...
 - 洛谷P3258松鼠的新家
		
题目传送门 恩,很明显的一个树剖题,配合树上差分其实也并不难,不过无奈蒟蒻树剖还没那么熟练,而且树上差分也做的少,所以这题愣是做了一中午......唉,果然我还是太菜了.恩,具体做法在代码中解释吧: ...
 - BZOJ3631:[JLOI2014]松鼠的新家——题解
		
http://www.lydsy.com/JudgeOnline/problem.php?id=3631 https://www.luogu.org/problemnew/show/P3258 松鼠的 ...
 - 洛谷 P3258 [JLOI2014]松鼠的新家 题解
		
P3258 [JLOI2014]松鼠的新家 题目描述 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他 ...
 - P3258 [JLOI2014]松鼠的新家题解
		
题目描述 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有\(n\)个房间,并且有\(n-1\)根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他居然真的住在"树& ...
 
随机推荐
- DiSC小记
			
最近在单位进行管理培训时进行了一个DiSC的心理测试,DiSC是Dominance,influence,Steadiness和Conscientiousness四个英文单词的首字母缩写.这四个单词对应 ...
 - Xocde 自动注释插件
			
github 地址 https://github.com/onevcat/VVDocumenter-Xcode 可以对xcode方法进行类似java那样的自动注释 源码下载下后编译运行一次 xo ...
 - iOS --  iOS11新特性,如何适配iOS11
			
前言 这几天抽空把WWDC的Session看了一些,总结了一些iOS11新的特性,可能对我们的App有影响,需要我们进行适配.本文作为一个总结. 本文内容包括:集成了搜索的大标题栏.横向选项卡栏.Ma ...
 - eos智能合约与主进程交互
			
eos智能合约与主进程交互 1.启动wasm 参考eos智能合约执行流程.md 2.智能合约调用主进程api 如何实现wasm代码与eos宿主交互还需要摸索! 大致:在wasm_interface.c ...
 - [置顶]
        django快速获取项目所有的URL
			
django快速获取项目所有的URL django1.10快速获取项目所有的URL列表,可以用于权限控制 函数如下: import re def get_url(urllist , parent='' ...
 - hdu1017(C++)
			
这个题目很水,但是卡了格式和m=0的情况,wa了好多次,题目只给出N=1,感觉没说清楚 #include<iostream>using namespace std;int main(){ ...
 - ALBB 找公共最长连续字母序列的长度
			
问题描写叙述 给定一个 query 和一个 text .均由小写字母组成.要求在 text 中找出以相同的顺序连续出如今 query 中的最长连续字母序列的长度. 比如, query为"ac ...
 - Hadoop部署启动异常问题排查
			
hadoop的日志目录(/home/hadoop/app/hadoop-2.6.4/logs) 1.hadoop启动不正常用浏览器访问namenode的50070端口,不正常,需要诊断问题出在哪里: ...
 - Android性能优化Google课程翻译一:Render----OverDraw实战
			
Context 近期实战了下OverDraw,加深了下理解.在上篇文章里Android性能优化Google课程翻译一:Render----OverDraw 写过详细方法. OverDraw解决方法离不 ...
 - [LeetCode] Decode Ways 解码方法个数、动态规划
			
A message containing letters from A-Z is being encoded to numbers using the following mapping: 'A' - ...