BZOJ 3631 松鼠的新家 树上差分
我猜会有智障说直接链剖+线段树…(希望没有) From RYC's 课件
然鹅我并不反对树剖。。。我是智障。。。QAQ
好吧还是树上差分:设 a[i]=u.a[i+1]=v
++w[u],++w[v],--w[lca(u,v)],--w[fa of lca(u,v)] 最后dfs一边统计答案
#pragma GCC optimize (2)
#include<cstdio>
#include<iostream>
#define R register int
const int M=;
using namespace std;
inline int g() {
R ret=; register char ch; while(!isdigit(ch=getchar()));
do ret=ret*+(ch^); while(isdigit(ch=getchar())); return ret;
}
int n,cnt;
int vr[M<<],nxt[M<<],fir[M],a[M],d[M],f[M][],w[M],ans[M];
inline void add(int u,int v) {vr[++cnt]=v,nxt[cnt]=fir[u],fir[u]=cnt;}
void dfs(int u) {
for(R i=fir[u];i;i=nxt[i]) { R v=vr[i];
if(d[v]) continue; d[v]=d[u]+; R p=u; f[v][]=u;
for(R j=;f[p][j];++j) f[v][j+]=f[p][j],p=f[p][j];
dfs(v);
}
}
inline void lca(int u,int v) {
if(d[u]<d[v]) swap(u,v); R uu=u,vv=v;
for(R j=;j>=;--j) if(d[f[u][j]]>=d[v]) u=f[u][j];
if(u==v) {--w[u],--w[f[u][]],++w[uu],++w[vv]; return ;}
for(R j=;j>=;--j) if(f[u][j]!=f[v][j]) u=f[u][j],v=f[v][j];
u=f[u][]; ++w[uu],++w[vv],--w[u],--w[f[u][]]; return ;
}
void dfs2(int u) {
for(R i=fir[u];i;i=nxt[i]) { R v=vr[i];
if(v==f[u][]) continue; dfs2(v);
w[u]+=w[v];
}
}
signed main() {
n=g(); for(R i=;i<=n;++i) a[i]=g();
for(R i=,u,v;i<n;++i) u=g(),v=g(),add(u,v),add(v,u);
d[]=; dfs(); for(R i=;i<n;++i) lca(a[i],a[i+]); dfs2();
for(R i=;i<=n;++i) printf("%d\n",(i==a[]?w[i]:w[i]-));
}
2019.04.22
BZOJ 3631 松鼠的新家 树上差分的更多相关文章
- BZOJ 3631: [JLOI2014]松鼠的新家 树上差分 + LCA
Description 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他居然真的住在“树”上.松鼠想邀 ...
- BZOJ 3631 松鼠的新家 - 树链剖分 / 树上差分
传送门 分析: 树链剖分:x->y,将x到y的路径加一,并将x端点的答案-1,最后统计答案. 树上差分:x->y,x+1,y+1,lca-1,fa[lca]-1,并将x打上标记,最后统计前 ...
- bzoj3631 [JLOI2014]松鼠的新家——树上差分
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3631 树上差分:注意路径的结尾被多算了一次,最后要减去(不能提前减). 代码如下: #inc ...
- [JLOI2014]松鼠的新家 树上差分
差分 一开始竟然想分情况讨论来差分,然后发现各自情况要分析, 就是为了解决中间节点重复计算的问题, 结果 最后一想,中间重复计算了一次,那我最后减掉不就好了么,,, 那这就是一道差分裸题了(这是唯一不 ...
- BZOJ.3631.[JLOI2014]松鼠的新家(树上差分)
题目链接 树剖/差分裸题.. //28260kb 584ms #include <cstdio> #include <cctype> #include <algorith ...
- bzoj 3631 松鼠的新家 (树链剖分)
链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3631 思路: 直接用树链剖分求每一次运动,因为这道题只需要区间增添,单点求值,没必要用线段 ...
- BZOJ - 3631 松鼠的新家 (树链剖分)
题目链接 树链剖分基础题,路径权值修改+差分 #include<bits/stdc++.h> using namespace std; typedef long long ll; ; in ...
- BZOJ 3631 松鼠的新家
链剖. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> ...
- 【bzoj3631】[JLOI2014]松鼠的新家 LCA+差分数组
题目描述 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他居然真的住在“树”上.松鼠想邀请小熊维尼前来 ...
随机推荐
- spring bean属性及子元素使用总结
spring bean属性及子元素使用总结 2016-08-03 00:00 97人阅读 评论(0) 收藏 举报 分类: Spring&SpringMVC(17) 版权声明:本文为博主原创 ...
- HTML布局,插件的调用方法
- matlab基础功能实践
一.matlab在高等数学中的应用(<数学建模算法与应用>P453) 1.求极限 syms x b=limit((sqrt(1+x^2)-1)/(1-cos(x))) syms x a b ...
- Flow Layout
--------------siwuxie095 将根面板 contentPane 的布局切换为 Flow Layout Flow La ...
- Executor线程池
Executor线程池框架: 使用线程池的优点: 1.重用存在的线程 2.减少对象创建.消亡的开销 3.性能佳 4.可有效控制最大并发线程数,提高系统资源的使用率 5.避免过多资源竞争,避免堵塞 6. ...
- ElasticSearch 入门(转)
最大的特点: 1. 数据库的 database, 就是 index 2. 数据库的 table, 就是 tag 3. 不要使用browser, 使用curl来进行客户端操作. 否则会出现 jav ...
- Linux uname命令
一.简介 uname 命令将正在使用的操作系统名写到标准输出中. 二.语法 -a 显示 -m. -n. -r. -s 和 -v 标志指定的所有信息.不能与 -x 或 -SName 标志连用.如果 -x ...
- [gist]Android SHA-1
参考:http://stackoverflow.com/questions/5980658/how-to-sha1-hash-a-string-in-android 代码:
- poj3557 Map Generator
传送门 题目大意 给定两个数n,p;表示n个点中任意两点连边的概率为p,求生成的图是个连通块的概率 分析 我们发现直接求产生联通块的概率并不容易,于是我们转而考虑计算不能生成联通块的概率,公式如下: ...
- Luogu 1641 [SCOI2010]生成字符串
结果和dp没有一点关系…… 30分算法:设$f_{i, j}$表示已经选了$i$个并且有$j$个是白色的状态数,转移显然,最后答案就是$f_{n + m, m}$,时间复杂度$O(n^{2})$. 1 ...