首页 技术 正文
技术 2022年11月15日
0 收藏 627 点赞 2,556 浏览 1109 个字

题目大意:一棵树,以一定顺序走完n个点,求每个点经过多少遍

可以树链剖分,也可以直接在树上做差分序列的标记

后者打起来更舒适一点。。

具体实现:

先求x,y的lca,且dep[x]<dep[y],

如果在一棵子树下的一条链上,那么lca就是x

则g[fa[x]]–; g[y]++;

如果在一棵子树的两条分枝上,那么lca设为z

g[x]++, g[y]++, g[z]–, g[fa[z]]–

最后从叶子节点加回根节点,加法是差分序列的那种加法

因为z会加左右两边,多加了1,所以要减去。

 #include<stdio.h> #include<algorithm> using namespace std; ; struct node{     int to,next; }e[maxn*]; ],w[maxn],f[maxn],tot,logn; void insert(int u, int v){     e[++tot].to=v; e[tot].next=head[u]; head[u]=tot; } void dfs(int u, int f, int d){     dep[u]=d; fa[u][]=f;     ; i<=logn; i++) fa[u][i]=fa[fa[u][i-]][i-];     for (int i=head[u]; i; i=e[i].next)         ); } void lca(int u, int v){     if (dep[u]<dep[v]) swap(u,v);     int x=u,y=v;     while (dep[u]>dep[v]){         ; i--)             if (dep[fa[u][i]]>dep[v])                 u=fa[u][i];         u=fa[u][];     }     if (u==v){  //在某条链上         w[fa[u][]]--;         w[x]++;         return;     }     ; i--)  //在分叉口上         if (fa[u][i]!=fa[v][i]){             u=fa[u][i];             v=fa[v][i];         }     u=fa[u][];     w[x]++; w[y]++;     w[u]--; w[fa[u][]]--;     return; } void get_ans(int u){     f[u]=w[u];// printf("  %d\n", w[u]);     for (int i=head[u],v; i; i=e[i].next){         ]) continue;         get_ans(e[i].to);         f[u]+=f[v];     } } int main(){     scanf("%d", &n);     ; i<=n; i++) scanf(; <<logn)<n) logn++;     ,u,v; i<n; i++) scanf(,a[]);     dfs(,,);     ; i<=n; i++){         lca(a[i-],a[i]);     }     get_ans(a[]);     ; i<=n; i++) printf(])?f[i]:f[i]-);     ; }
上一篇: Location 对象
下一篇: js对象定义
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:8,949
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,475
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,288
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,103
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,735
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,770