题意:求一棵树上∑i\sum i∑i号节点到它所有因子的路径和;
分析:预处理因子,LCA求树上两点距离(logn).

#include <cstdio>
#include <algorithm>
#include <cmath>
#include <queue>
#include <vector>
#include <cstring>
using namespace std;
typedef long long LL;const int MAXN = 4e5 + 10;
int gw[MAXN][30];
int grand[MAXN][30];
int depth[MAXN];
int n, N;struct node {int to;int cos;
}e;
vector<node> G[MAXN];
vector<int> V[MAXN];
inline void dfs(int x, int fa) { for(int i = 1; i <= N; ++i) {grand[x][i] = grand[grand[x][i - 1]][i - 1];gw[x][i] = gw[x][i - 1] + gw[grand[x][i - 1]][i - 1];}for(int i = 0; i < G[x].size(); ++i) {e = G[x][i];if(e.to == fa) continue;depth[e.to] = depth[x] + 1;grand[e.to][0] = x;gw[e.to][0] = e.cos;dfs(e.to, x);}
}inline void init() {for(int i = 2; i <= n; ++i) {for(int j = 1; j * j <= i; ++j) {if(i % j == 0) V[i].push_back(j);if(i % j == 0 && i / j != j) V[i].push_back(i / j);}}N = floor(log(double(n)) / log(2.0));dfs(1, -1);
}inline int lca(int a, int b) {if(depth[a] > depth[b]) swap(a, b);int ans = 0;for(int i = N; i >= 0; --i) {if(depth[a] < depth[b] && depth[grand[b][i]] >= depth[a]) {ans += gw[b][i];b = grand[b][i];}}for(int i = N; i >= 0; --i) {if(grand[a][i] == grand[b][i]) continue;ans += gw[a][i];ans += gw[b][i];a = grand[a][i];b = grand[b][i];}if(a != b) ans += gw[a][0] + gw[b][0];return ans;
}int main() {int x, y, w = 1;scanf("%d", &n);for(int i = 1; i < n; ++i) {scanf("%d %d", &x, &y);e.to = y, e.cos = w;G[x].push_back(e);e.to = x;G[y].push_back(e);}init(); LL sum = 0;for(int i = 1; i <= n; ++i) {for(int j = 0; j < V[i].size(); ++j) {int u = V[i][j];if(u == i) continue;//  printf("## %d %d\n", u, i);sum += lca(u, i) + 1;}}printf("%lld\n", sum);return 0;
}

NAIPC2016 I. Tourists【LCA】相关推荐

  1. 【洛谷】1600:天天爱跑步【LCA】【开桶】【容斥】【推式子】

    P1600 天天爱跑步 题目描述 小c同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.<天天爱跑步>是一个养成类游戏,需要玩家每天按时上线,完成打卡任务. 这个 ...

  2. 【BFS】【并查集】【Tarjan】【LCA】Gym - 101173H - Hangar Hurdles

    给你一张地图,给你q次询问,每次问你从A点到B点,最大能移动多大的箱子. 把每个点所能容纳的最大箱子求出来(BFS,八连通,一开始将所有边界点和障碍点入队).然后从大到小排序.然后用并查集将相邻(四联 ...

  3. P4427-[BJOI2018]求和【LCA】

    正题 题目大意:https://www.luogu.org/problem/P4427 题目大意 一棵树,每次给一条路径,求路径上每个点的深度的kkk次方的和. 解题思路 路径上分成两条深度连续的链, ...

  4. jzoj3054-祖孙询问【LCA】

    正题 题目大意 求两个点的祖孙关系. 解题思路 直接LCALCALCA,然后暴力判断. codecodecode #include<cstdio> #include<algorith ...

  5. 【线段树】【LCT】【LCA】树点涂色(luogu 3703)

    树点涂色 luogu 3703 题目大意 给出一棵树,每个节点的初始颜色不同,做若干操作: 1.在一个点到根节点路径上染上一种新的颜色 2.查询一条路径上有多少种不同的颜色 3.查询一个点x,使该点到 ...

  6. 【数学期望】【LCA】【树形DP】树

    树 题目大意 给你一棵有n个节点的树,以及m个询问,每个询问需要你回答一个点到另一个点要经过的期望边数 输入样例 4 2 1 2 2 3 3 4 1 4 3 4 输出样例 9 5 数据范围 对于 20 ...

  7. HDU 2586 How far away ?【LCA】

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2586 题意: 无向图,给定边及边权重,任意两点之间都有一条唯一的道路,道路上每个点只能出现一次.给定 ...

  8. POJ 1330:Nearest Common Ancestors【lca】

    题目大意:唔 就是给你一棵树 和两个点,问你这两个点的LCA是什么 思路:LCA的模板题,要注意的是在并查集合并的时候并不是随意的,而是把叶子节点合到父节点上 #include<cstdio&g ...

  9. 跳跳棋【LCA】【二分】

    >Description 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子. 我们用跳跳棋来做一个简单的游戏:棋盘上有3颗棋子,分别在a,b,c这三个位置.我们要通过最少 ...

  10. 【LCA】最近公共祖先问题Lowest Common Ancestors

    昨天集训出了一道LCA的题目,我只会写暴力然后不知道为啥崩栈了,然后想起了去年NOIP Day1 T3 也是不会LCA就废了,然后就没有然后了.....于是我今天学习了各种LCA的做法. LCA:对于 ...

最新文章

  1. 表单界面的兼容PC手机端解决方案
  2. python中文名字叫什么-Python为什么取名为Python,很少人知道
  3. Gluon.vision的几类数据集
  4. 数博会重磅活动:第二届大数据科学与工程国际会议日程
  5. 基于JAVA+SpringMVC+Mybatis+MYSQL的高校后勤管理系统
  6. Ubuntu环境搭建一:安装tftp服务器程序
  7. U盘启动制作软件推荐:Rufus
  8. python对话框打开文件_python打开文件对话框
  9. 共模干扰与差模干扰(及其消除)
  10. python中怎么打印出表格_Python 表格打印
  11. 对List中的map的key按中文拼音进行排序。
  12. android studio keystore.jks,jks和keystore的区别
  13. c++数组指针和指针数组详解
  14. python 识别人名_HanLP中人名识别分析
  15. 银联Pos终端签到、签退、批结算、批上送
  16. 怎么把部分jsp代码嵌入另一个jsp页面里面
  17. 前端:给中国奥运金牌数做可视化
  18. IPTV(网络电视)
  19. 无影无踪的增量(又理解下java的的引用....)
  20. AMS TMF8820/21/28 confidence介绍

热门文章

  1. shopnc linux im安装教程,shopnc编译安装IM服务器node.js
  2. VC++界面编程之--实现工具栏自定义皮肤
  3. python循环结构语句实现_Python的循环结构
  4. 【寻找最佳小程序】12期:小程序数据助手——微信官方打造,移动端数据分析工具...
  5. Excel精选28个实用技巧实例学习
  6. 【redux------状态管理库】
  7. Hack the box: Bastion
  8. matlab数字信号处理常用函数
  9. POJ 1371 Tin Cutter 笔记
  10. MeanTeacher论文学习笔记