最开始的时候我在写线段树部分的时候还打了一个build,后来一想,打个球球大作战的build啊!!!有个锤子的用啊!!!

 #include<bits/stdc++.h>
using namespace std;
const int maxn = 3e6+;
int n;
int e,begin[maxn],next[maxn],to[maxn],a[maxn];
int tree[maxn<<],lazy[maxn<<];
int son[maxn],father[maxn],id[maxn],cnt,deep[maxn],size[maxn],top[maxn];
int res;
inline int read(){
int s=,w=;
char ch=getchar();
while(ch<=''||ch>''){if(ch=='-')w=-;ch=getchar();}
while(ch>=''&&ch<='') s=s*+ch-'',ch=getchar();
return s*w;
}
inline void add(int x,int y){
to[++e] = y;
next[e] = begin[x];
begin[x] = e;
}
inline void pushup(int root){
tree[root] = tree[root<<]+tree[root<<|];
}
inline void pushdown(int root,int pos){
lazy[root<<] += lazy[root];
lazy[root<<|] += lazy[root];
tree[root<<] += lazy[root]*(pos-(pos>>));
tree[root<<|] += lazy[root]*(pos>>);
lazy[root] = ;
}
inline void query(int root,int l,int r,int al,int ar){
if(al <= l && ar >= r){
res += tree[root];
return;
}
if(lazy[root])pushdown(root,r-l+);
int mid = l+r>>;
if(al <= mid)query(root<<,l,mid,al,ar);
if(ar > mid)query(root<<|,mid+,r,al,ar);
}
inline void update(int root,int l,int r,int al,int ar,int k){
if(al <= l && ar >= r){
lazy[root] += k;
tree[root] += k*(r-l+);
return;
}
if(lazy[root])pushdown(root,r-l+);
int mid = l+r>>;
if(al <= mid)update(root<<,l,mid,al,ar,k);
if(ar > mid)update(root<<|,mid+,r,al,ar,k);
pushup(root);
}
inline void update_range(int x,int y,int k){
while(top[x] != top[y]){
if(deep[top[x]] < deep[top[y]])swap(x,y);
update(,,n,id[top[x]],id[x],k);
x = father[top[x]];
}
if(deep[x] > deep[y])swap(x,y);
update(,,n,id[x],id[y],k);
}
inline void dfs1(int x,int fa,int dep){
deep[x] = dep;
father[x] = fa;
size[x] = ;
int maxson = -;
for(int i = begin[x];i;i = next[i]){
int y = to[i];
if(y == fa)continue;
dfs1(y,x,dep+);
size[x] += size[y];
if(size[y] > maxson)son[x] = y,maxson = size[y];
}
}
inline void dfs2(int x,int topf){
id[x] = ++cnt;
top[x] = topf;
if(!son[x])return;
dfs2(son[x],topf);
for(int i = begin[x];i;i = next[i]){
int y = to[i];
if(y == father[x] || y == son[x])continue;
dfs2(y,y);
}
}
int main(){
n = read();
for(int i = ;i <= n;i++)a[i] = read();
for(int i = ,x,y;i < n;i++){
x = read();
y = read();
add(x,y);
add(y,x);
}
dfs1(,,);
dfs2(,);
for(int i = ;i < n;i++){
update_range(a[i],a[i+],);
update_range(a[i+],a[i+],-);
}
for(int i = ;i <= n;i++)res = ,query(,,n,id[i],id[i]),printf("%d\n",res);
return ;
}

[JLOI2014]松鼠的新家-树链剖分的更多相关文章

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

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

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

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

  3. 洛谷 P3258 [JLOI2014]松鼠的新家 树链剖分+差分前缀和优化

    目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例: 输出样例: 说明 说明 思路 AC代码 优化 优化后AC代码 总结 题面 题目链接 P3258 [JLOI2 ...

  4. 洛谷 P3258 [JLOI2014]松鼠的新家(树链剖分)

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

  5. P3258 [JLOI2014]松鼠的新家 树链剖分

    这个题就是一道树剖板子题,就是每走一步就把所有的经过点加一就行了.还有,我的树剖板子没问题!!!谁知道为什么板子T3个点!我不管了!反正这道题正常写A了. 题干: 题目描述 松鼠的新家是一棵树,前几天 ...

  6. BZOJ3631 松鼠的新家(树链剖分)

    题目链接 松鼠的新家 差不多可以说是树链剖分的模板题了,直接维护即可. #include <bits/stdc++.h> using namespace std; #define REP( ...

  7. 【BZOJ3631】松鼠的新家 树链剖分

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

  8. P3285 松鼠的新家 (树链剖分)

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

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

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

随机推荐

  1. Python中的 sort 和 sorted

    今天在做一道题时,因为忘了Python中sort和sorted的用法与区别导致程序一直报错,找了好久才知道是使用方法错误的问题!现在就大致的归纳一下sort和sorted的用法与区别 1. sort: ...

  2. laravel 预加载特定的列

    /**订单列表 0 已删除 1执行中 2 已过期 * * @param Request $request * * @return \Illuminate\Contracts\View\Factory| ...

  3. LVS结合keepalive

    LVS可以实现负载均衡,但是不能够进行健康检查,比如一个rs出现故障,LVS 仍然会把请求转发给故障的rs服务器,这样就会导致请求的无效性.keepalive 软件可以进行健康检查,而且能同时实现 L ...

  4. h5手机查看

    1.装个node:2.全局装个anywhere的npm包.(npm i -g anywhere)3.大功告成,现在到任意目录下用命令行执行anywhere就可以:(-p 参数可以设置启动端口) 补充: ...

  5. setData 和 直接赋值的区别

    wxml: <view> <block wx:for="{{dataArray}}" wx:key="id"> <v-book b ...

  6. package---包

    一,包 包(package) 用于管理程序中的类,主要用于解决类的同名问题.包可以看成目录. 包的作用: [1] 防止命名冲突. [2] 允许类组成一个单元(模块),便于管理和维护 [3] 更好的保护 ...

  7. EXCEL计算根据当前时间和身份证号计算准确年龄

    假设身份证号在A2单元格 =IF(MONTH(NOW())<MONTH(DATE(MID(A2,7,4),MID(A2,11,2),MID(A2,13,2))),INT(YEAR(NOW())- ...

  8. 【BZOJ4000】[TJOI2015]棋盘(矩阵快速幂,动态规划)

    [BZOJ4000][TJOI2015]棋盘(矩阵快速幂,动态规划) 题面 BZOJ 洛谷 题解 发现所有的东西都是从\(0\)开始编号的,所以状压只需要压一行就行了. 然后就可以随意矩乘了. #in ...

  9. ios端position为fixed失效的解决办法

    关键代码 document.getElementById("searchInputbox").addEventListener('touchmove', handler, {pas ...

  10. [leetcode] 5.Longest Palindromic Substring-1

    开始觉得挺简单的 写完发现这个时间超限了: class Solution: def longestPalindrome(self, s: str) -> str: # longest palin ...