树剖,裸题,鉴定完毕。

我是题面

读完题,恩,树剖,裸题,没劲。

处理很简单,既然每到一个房间吃一块糖,那么就在每条路径上的每个房间放一颗糖,但是每条路径的终点也就是下一条路径的起点,在这里只能加一次,所以别忘记处理完再-1,又因为最后一个点不需要糖,所以直接每条路径的终点的糖-1即可

上代码

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cctype>
#define ll long long
#define gc() getchar()
#define maxn 300005
using namespace std; inline ll read(){
ll a=0;int f=0;char p=gc();
while(!isdigit(p)){f|=p=='-';p=gc();}
while(isdigit(p)){a=(a<<3)+(a<<1)+(p^48);p=gc();}
return f?-a:a;
}
void write(ll a){
if(a>9)write(a/10);
putchar(a%10+'0');
}
int n,m,a[maxn]; int tot,head[maxn];
struct ahaha1{
int to,next;
}e[maxn<<1];
inline void add(int u,int v){
e[tot].to=v;e[tot].next=head[u];head[u]=tot++;
} int sz[maxn],dep[maxn],son[maxn],f[maxn];
void dfs(int u,int fa){
int maxa=0;sz[u]=1;
for(int i=head[u];~i;i=e[i].next){
int v=e[i].to;if(v==fa)continue;
f[v]=u;dep[v]=dep[u]+1;
dfs(v,u);sz[u]+=sz[v];
if(maxa<sz[v])maxa=sz[v],son[u]=v;
}
}
int top[maxn],in[maxn],b[maxn];
void dfs(int u,int fa,int topf){
top[u]=topf;in[u]=++tot;b[tot]=u;
if(!son[u])return;
dfs(son[u],u,topf);
for(int i=head[u];~i;i=e[i].next){
int v=e[i].to;if(v==fa||v==son[u])continue;
dfs(v,u,v);
}
} #define lc p<<1
#define rc p<<1|1
struct ahaha2{
ll v,lz;
}t[maxn<<2];
inline void pushup(int p){
t[p].v=t[lc].v+t[rc].v;
}
inline void pushdown(int p,int l,int r){
int m=l+r>>1;
t[lc].v+=t[p].lz*(m-l+1);t[lc].lz+=t[p].lz;
t[rc].v+=t[p].lz*(r-m);t[rc].lz+=t[p].lz;
t[p].lz=0;
}
void update(int p,int l,int r,int L,int R){
if(l>R||r<L)return;
if(L<=l&&r<=R){t[p].v+=r-l+1;t[p].lz++;return;}
int m=l+r>>1;if(t[p].lz)pushdown(p,l,r);
update(lc,l,m,L,R);update(rc,m+1,r,L,R);
pushup(p);
}
void update2(int p,int l,int r,int L){
if(l==r){t[p].v--;return;}
int m=l+r>>1;if(t[p].lz)pushdown(p,l,r);
if(m>=L)update2(lc,l,m,L);
else update2(rc,m+1,r,L);
pushup(p);
}
ll query(int p,int l,int r,int L){
if(l==r)return t[p].v;
int m=l+r>>1;if(t[p].lz)pushdown(p,l,r);
if(m>=L)return query(lc,l,m,L);
else return query(rc,m+1,r,L);
} inline void solve_1(int x,int y){
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]])swap(x,y);
update(1,1,n,in[top[x]],in[x]);
x=f[top[x]];
}
if(dep[x]>dep[y])swap(x,y);
update(1,1,n,in[x],in[y]);
} int main(){memset(head,-1,sizeof head);
n=read();
for(int i=1;i<=n;++i)a[i]=read();
for(int i=1;i<n;++i){
int x=read(),y=read();
add(x,y);add(y,x);
}
tot=0;dfs(1,-1);dfs(1,-1,1);
for(int i=2;i<=n;++i)
solve_1(a[i-1],a[i]),update2(1,1,n,in[a[i]]);
for(int i=1;i<=n;++i)
write(query(1,1,n,in[i])),putchar('\n');
return 0;
}

洛谷 P3258 [JLOI2014]松鼠的新家的更多相关文章

  1. 洛谷 P3258 [JLOI2014]松鼠的新家 解题报告

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

  2. 洛谷P3258 [JLOI2014]松鼠的新家

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

  3. 洛谷 P3258 [JLOI2014]松鼠的新家 题解

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

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

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

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

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

  6. 洛谷P3258 [JLOI2014]松鼠的新家(树上差分+树剖)

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

  7. 洛谷——P3258 [JLOI2014]松鼠的新家

    https://www.luogu.org/problem/show?pid=3258 题目描述 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到 ...

  8. 洛谷P3258 [JLOI2014]松鼠的新家【LCA+树上差分】

    简要题意 树上n个节点,给定路径,求每个点经过次数 题意分析 对于每两个点,有两种情况,第一种,他们的lca为本身,第二种,他们有公共祖先,又要求他们的点经过次数,暴力是不可能的,复杂度不对,所以可以 ...

  9. 【洛谷P3258】松鼠的新家

    很好的一道题 LCA+树上前缀和 sum数组是前缀和数组, 分类讨论一下, 1.访问到一个点p1,若下一个点p2需要往儿子下面找的话,那么lca就是这个点p1,则sum[p1]--; sum[p2]+ ...

随机推荐

  1. Zabbix学习之路(七)之Nginx的状态监控

    1.安装nginx [root@linux-node2 ~]# yum install -y nginx [root@linux-node2 ~]# mkdir /etc/zabbix/zabbix_ ...

  2. DSP6748学习笔记-190116

    1. PSC是什么?电源和睡眠控制器.一个PSC模块由一个全局PSC和一组本地PSC组成,那么又是什么? PSCModuleControl(SOC_PSC_0_REGS, , PSC_POWERDOM ...

  3. dotnet core 开发中遇到的问题

    1.发布的时候把视图cshtml文件也编译为dll了,如何控制不编译视图? 编辑功能文件(xx.csproj),加入一个选项: <PropertyGroup> <TargetFram ...

  4. JS 判断checkbox 是否选中

    <input type="checkbox" id="IsEnable" /> 在调试的时候,会出现,一直未true的状态,不管是选中还是未选中 解 ...

  5. 使用SCSS扩展Bootstrap4

    摘要 因为打算写一个小网站,而个人时间又不是那么充裕,所以没有选择前后端分离的架构. 对于非前后端分离应用来说,Bootstrap应该是目前的最佳前端框架之一了. 而Bootstrap4,是Boots ...

  6. 牛客网暑期ACM多校训练营(第四场):A Ternary String(欧拉降幂)

    链接:牛客网暑期ACM多校训练营(第四场):A Ternary String 题意:给出一段数列 s,只包含 0.1.2 三种数.每秒在每个 2 后面会插入一个 1 ,每个 1 后面会插入一个 0,之 ...

  7. sqli-labs学习笔记 DAY3

    DAY 3 sqli-labs lesson 6 同lesson 5,只是把单引号改为双引号 sqli-labs lesson 7 同lesson 5,只是把单引号后面加两个空格,使用Burpsuit ...

  8. java 乐观锁 vs 悲观锁

    在数据库的锁机制中介绍过,数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务同时存取数据库中同一数据时不破坏事务的隔离性和统一性以及数据库的统一性. 悲观锁其实就是 完全同步 比如 sync ...

  9. Scrum立会报告+燃尽图(十一月十八日总第二十六次):功能开发与讨论贡献分配规则

    此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2284 项目地址:https://git.coding.net/zhang ...

  10. Python:集合操作总结

    集合是一组无序排列的不重复元素集 [注]:集合的最大作用是对一个序列进行去重操作 一.集合的分类 在Python中集合分为两类,为可变集合(set)和不可变集合(frozenset).对于可变集合(s ...