刷题总结——松鼠的新家(bzoj3631)
题目:
Description
Input
Output
Sample Input
1 4 5 3 2
1 2
2 4
2 3
4 5
Sample Output
2
1
2
1
HINT
2<= n <=300000
题解:
这道题直接暴力做肯定是树链剖分···区间加加上单点询问···然而会T
看到区间加加上单点询问我们可以想到用差分来代替数据结构·····
这道题也算复习了树上差分吧······如果ab之间路径上的点加了1,我们可以再ab点上打上+1,再lca(a,b)和father[lac(a,b)]上打上-1标志···在一个点上打上X表示该点到root所有点的答案加上X·····
最后注意下中间那些转折点每次其实只用加一次···因为熊到达转折点后只吃一次糖就会接着走··而不是到达后吃一次,出发后又吃一次··注意减去多余部分·····
代码:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<ctime>
#include<cctype>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
const int N=3e5+;
int n,num[N],deep[N],g[N][],f[N];
int tot,fst[N],go[N*],nxt[N*];
inline int R()
{
char c;int f=;
for(c=getchar();c<''||c>'';c=getchar());
for(;c<=''&&c>='';c=getchar())
f=(f<<)+(f<<)+c-'';
return f;
}
inline void comb(int a,int b)
{
nxt[++tot]=fst[a],fst[a]=tot,go[tot]=b;
nxt[++tot]=fst[b],fst[b]=tot,go[tot]=a;
}
inline void init()
{
n=R();int a,b;
for(int i=;i<=n;i++) num[i]=R();
for(int i=;i<n;i++) a=R(),b=R(),comb(a,b);
deep[num[]]=;
}
inline void dfs(int u,int fa)
{
for(int e=fst[u];e;e=nxt[e])
{
int v=go[e];if(v==fa) continue;
deep[v]=deep[u]+,g[v][]=u;
dfs(v,u);
}
}
inline int lca(int a,int b)
{
if(deep[a]<deep[b]) swap(a,b);
int i,j;
for(i=;(<<i)<=deep[a];i++);i--;
for(j=i;j>=;j--)
if(deep[a]-(<<j)>=deep[b]) a=g[a][j];
if(a==b) return a;
for(i=;i>=;i--)
if(g[a][i]!=g[b][i]) a=g[a][i],b=g[b][i];
return g[a][];
}
inline void dp(int u)
{
for(int e=fst[u];e;e=nxt[e])
{
int v=go[e];if(v==g[u][]) continue;
dp(v);
f[u]+=f[v];
}
}
inline void solve()
{
for(int i=;i<=;i++)
for(int j=;j<=n;j++)
g[j][i]=g[g[j][i-]][i-];
for(int i=;i<n;i++)
{
int t=lca(num[i],num[i+]);
f[num[i]]++;f[num[i+]]++;f[t]--;f[g[t][]]--;
}
dp(num[]);
for(int i=;i<=n;i++) f[num[i]]--;
for(int i=;i<=n;i++) printf("%d\n",f[i]);
}
int main()
{
//freopen("a.in","r",stdin);
init();dfs(num[],);solve();
return ;
}
刷题总结——松鼠的新家(bzoj3631)的更多相关文章
- 【BZOJ3631】松鼠的新家 树链剖分
BZOJ3631 松鼠的新家 Description 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他 ...
- 【BZOJ-3631】松鼠的新家 树形DP?+ 倍增LCA + 打标记
3631: [JLOI2014]松鼠的新家 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1231 Solved: 620[Submit][Stat ...
- BZOJ3631 松鼠的新家(树链剖分)
题目链接 松鼠的新家 差不多可以说是树链剖分的模板题了,直接维护即可. #include <bits/stdc++.h> using namespace std; #define REP( ...
- 【bzoj3631】[JLOI2014]松鼠的新家
题目描述 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他居然真的住在"树"上.松 ...
- bzoj3631 松鼠的新家
Description 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他居然真的住在“树”上.松鼠想邀 ...
- 【bzoj3631】[JLOI2014]松鼠的新家 LCA+差分数组
题目描述 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他居然真的住在“树”上.松鼠想邀请小熊维尼前来 ...
- BZOJ3631:[JLOI2014]松鼠的新家——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=3631 https://www.luogu.org/problemnew/show/P3258 松鼠的 ...
- BZOJ3631 [JLOI2014]松鼠的新家 【树上差分】
题目 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他居然真的住在"树"上.松鼠想 ...
- [BZOJ3631]:[JLOI2014]松鼠的新家(LCA+树上差分)
题目传送门 题目描述: 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他居然真的住在“树”上.松鼠想邀 ...
随机推荐
- Windows 漏洞利用开发
第一阶段:简单栈溢出 分析栈溢出原理 寻找溢出点,了解pattern_create和pattern_offset计算溢出点的原理 寻找JMP ESP跳板,分析利用JMP ESP跳板劫持程序流的原理 编 ...
- HTTP、HTTP2.0、HTTPS、SPDY
本文原链接:https://cloud.tencent.com/developer/article/1082516 HTTP,HTTP2.0,SPDY,HTTPS你应该知道的一些事 1.web始祖HT ...
- 使用EventLog组件读写事件日志
实现效果: 知识运用: Eventlog类的SourceExists方法 //确定指定的事件源是否已在本地计算机注册 public static bool SourceExists(string s ...
- Bootstrap历练实例:标签修饰
您可以使用修饰的 class label-default.label-primary.label-success.label-info.label-warning.label-danger 来改变标签 ...
- deque 用法
引用博客:https://blog.csdn.net/zyq522376829/article/details/46801973 下面是那位大佬写的的笔记整理~~~~ deque - 双向队列 1.构 ...
- 变量赋值理解--Pyton中让两个值互换的方法
#Pyton中让两个值互换的方法 #方法一:可以理解为相当于是同时赋值 a = 5 b = 4 a,b = b,a print(a,b) #方法二:可以理解为拿箱子过程 c = 10 d = 20 e ...
- linux优化之优化开机自启动服务
过滤出来需要的开机自启动项:chkconfig --list|grep 3:on|grep -v "crond|sshd|network|rsyslog|sysstat" ...
- 前端MVVM模式及其在Vue和React中的体现
MVVM相关概念 Mvvm 前端数据流框架精讲 1) MVVM典型特点是有四个概念:Model.View.ViewModel.绑定器.MVVM可以是单向绑定也可以是双向绑定甚至是不绑定 2) 绑定器: ...
- AHB 总线问答(转)
AHB总线问答 http://blog.163.com/huanhuan_hdu/blog/static/1352981182011625916845/ 仲裁:主设备可以在一个突发传输中解除HLOCK ...
- 怎么删除服务中的mysql服务
可以进WINDOWS的管理里查看MYSQL的服务,把它停止或以DOS下用命令停止1.如果要卸载MYSQL执行下面命令:DOS下>mysqld -remove mysql2.启动MYSQL: DO ...