[JLOI2014]松鼠的新家-树链剖分
最开始的时候我在写线段树部分的时候还打了一个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]松鼠的新家-树链剖分的更多相关文章
- BZOJ 3631: [JLOI2014]松鼠的新家( 树链剖分 )
裸树链剖分... ------------------------------------------------------------------- #include<bits/stdc++ ...
- Bzoj 3631: [JLOI2014]松鼠的新家(树链剖分+线段树)
3631: [JLOI2014]松鼠的新家 Time Limit: 10 Sec Memory Limit: 128 MB Description 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个 ...
- 洛谷 P3258 [JLOI2014]松鼠的新家 树链剖分+差分前缀和优化
目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例: 输出样例: 说明 说明 思路 AC代码 优化 优化后AC代码 总结 题面 题目链接 P3258 [JLOI2 ...
- 洛谷 P3258 [JLOI2014]松鼠的新家(树链剖分)
题目描述松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他居然真的住在”树“上. 松鼠想邀请小熊维尼前来 ...
- P3258 [JLOI2014]松鼠的新家 树链剖分
这个题就是一道树剖板子题,就是每走一步就把所有的经过点加一就行了.还有,我的树剖板子没问题!!!谁知道为什么板子T3个点!我不管了!反正这道题正常写A了. 题干: 题目描述 松鼠的新家是一棵树,前几天 ...
- BZOJ3631 松鼠的新家(树链剖分)
题目链接 松鼠的新家 差不多可以说是树链剖分的模板题了,直接维护即可. #include <bits/stdc++.h> using namespace std; #define REP( ...
- 【BZOJ3631】松鼠的新家 树链剖分
BZOJ3631 松鼠的新家 Description 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他 ...
- P3285 松鼠的新家 (树链剖分)
题目描述 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他居然真的住在”树“上. 松鼠想邀请小熊维尼前 ...
- BZOJ - 3631 松鼠的新家 (树链剖分)
题目链接 树链剖分基础题,路径权值修改+差分 #include<bits/stdc++.h> using namespace std; typedef long long ll; ; in ...
随机推荐
- vim命令:编辑模式和命令模式
vim:编辑模式 从一般模式进入编辑模式,只需你按一个键即可(i,I,a,A,o,O,r,R).当进入编辑模式时,会在屏幕的最下一行出现“INSERT或REPLACE”的字样.从编辑模式回到一般模 ...
- Scanner的使用 猜数字 +猜电影
猜数字public class Main { public static void main(String[] args) { int random=(int)(Math.random()*100)+ ...
- Java的String和StringBuilder
一.String 1.创建String对象的方法: String s1="haha"; String s2=new String(); String s3=new String(& ...
- c提高第五次作业
重写结构体嵌套一级指针老师和二级指针学生的代码 //结构体类型,每个导师有三个学生 typedef struct Teacher { char *tName; //导师 char **stu; //三 ...
- 使用Crawler框架搭建自己的爬虫框架MyCrawler
自己写一个爬虫框架的目的: 完美架构 在实际的数据采集编码过程中,发现代码比较乱,抓取数据,存储数据的代码混杂在一起,为了构建比较完美的数据采集框架 敏捷开发 将数据采集进行标准流程化,每个标准流程都 ...
- Spring MVC 使用介绍(十四)文件上传下载
一.概述 文件上传时,http请求头Content-Type须为multipart/form-data,有两种实现方式: 1.基于FormData对象,该方式简单灵活 2.基于<form> ...
- 【XSY3345】生成树 并查集
题目大意 有一个两部各有 \(n\) 个节点的二分图 \(G\),定义 \(G^m\) 为一个 \(m+1\) 层的图,每层有 \(n\) 个节点,相邻两层的诱导子图都和 \(G\) 相同. 给你 \ ...
- yii2 使用指定数据库执行createCommand
Yii::$app->dbName->createCommand($sql)->queryAll(); 指定dbName数据库配置
- mac查看git路径
mac查看git路径
- markdown 数学公式
https://blog.csdn.net/zdk930519/article/details/54137476