当前位置: 首页 > news >正文

广州市建设监理协会网站/哪些店铺适合交换友情链接

广州市建设监理协会网站,哪些店铺适合交换友情链接,网站建设网站维护,网站建设管理流程bzoj4381 [POI2015]Odwiedziny 给定一棵带点权的树,每次询问在 \(u\) 到 \(v\) 的路径上,每次走 \(k\) 步,如果最后不足 \(k\) 步就走到了 \(v\) ,则会一步走到 \(v\) ,求每次行走的经过的点的点权和 \(n\leq5\times10…

bzoj4381 [POI2015]Odwiedziny

给定一棵带点权的树,每次询问在 \(u\)\(v\) 的路径上,每次走 \(k\) 步,如果最后不足 \(k\) 步就走到了 \(v\) ,则会一步走到 \(v\) ,求每次行走的经过的点的点权和

\(n\leq5\times10^4,\ a_i\leq10^4\)

根号分治


考虑根号分治,如果 \(k>\sqrt n\) ,每次暴力枚举走到的节点,反之,预处理所有点每次走 \(i(i\leq\sqrt n)\) 步直到超过根的深度所经过的点权和(与 \(i\) 到根的路径不同),询问时计算贡献。

对于 \(k>\sqrt n\) 的询问,需特判 \(u=v\)\(v=lca\) 的情况,并且需要快速查询一个点的 \(k\) 级祖先,用倍增即可,时间复杂度 \(O(\sqrt n\log n)\)

对于 \(k\leq\sqrt n\) 的询问,同样要特判 \(u=v\)\(v=lca\) 的情况,还需注意 \(lca\to v\) 的路径的贡献。预处理时间复杂度 \(O(n\sqrt n\log n)\) ,单次查询 \(O(\log n)\)

综上,时间复杂度 \(O(n\sqrt n\log n)\) ,貌似把倍增换成长链剖分可以做到 \(O(n\sqrt n)\)

代码(开 C++11)

#include <bits/stdc++.h>
using namespace std;const int maxn = 5e4 + 10;
int n, bsz, a[maxn], dep[maxn], fa[16][maxn], sum[225][maxn];vector <int> e[maxn];int findlca(int u, int v) {if (dep[u] < dep[v]) swap(u, v);for (int i = 15; ~i; i--) {if (dep[u] - (1 << i) >= dep[v]) {u = fa[i][u];}}if (u == v) return u;for (int i = 15; ~i; i--) {if (fa[i][u] != fa[i][v]) {u = fa[i][u], v = fa[i][v];}}return fa[0][u];
}int findanc(int u, int k) {for (int i = 0; i < 16; i++) {if (k >> i & 1) u = fa[i][u];}return u;
}void dfs1(int u, int f) {fa[0][u] = f;dep[u] = dep[f] + 1;for (int i = 1; i < 16; i++) {fa[i][u] = fa[i - 1][fa[i - 1][u]];}for (int v : e[u]) {if (v != f) dfs1(v, u);}
}void dfs2(int u, int f) {for (int i = 1; i <= bsz; i++) {sum[i][u] = sum[i][findanc(u, i)] + a[u];}for (int v : e[u]) {if (v != f) dfs2(v, u);}
}int query1(int u, int v, int k) {if (u == v) return a[u];int lca = findlca(u, v), res = 0;int delta = dep[u] - dep[lca];int anc = findanc(u, delta - delta % k);res = sum[k][u] - sum[k][anc] + a[anc], u = anc;if (v == lca) return res;int s = dep[u] + dep[v] - dep[lca] - dep[lca];if (s > k && s % k) {res += a[v], v = findanc(v, s % k);}s = dep[u] + dep[v] - dep[lca] - dep[lca];int tmp = s > k ? findanc(v, s - k) : v;res += sum[k][v] - sum[k][tmp] + a[tmp];return res;
}int query2(int u, int v, int k) {if (u == v) return a[u];int lca = findlca(u, v), res = a[u] + a[v];while (1) {int anc = findanc(u, k);if (dep[anc] < dep[lca] || (v == lca && dep[anc] == dep[v])) {break;}res += a[anc], u = anc;}v = findanc(v, (dep[u] + dep[v] - dep[lca] - dep[lca]) % k);while (1) {int anc = findanc(v, k);if (dep[anc] <= dep[lca]) {break;}res += a[anc], v = anc;}return res;
}int main() {scanf("%d", &n);bsz = sqrt(n);for (int i = 1; i <= n; i++) {scanf("%d", a + i);}for (int i = 1; i < n; i++) {int u, v;scanf("%d %d", &u, &v);e[u].push_back(v), e[v].push_back(u);}dfs1(1, 0), dfs2(1, 0);static int step[maxn];for (int i = 1; i <= n; i++) {scanf("%d", step + i);}for (int i = 2; i <= n; i++) {int u = step[i - 1], v = step[i], k;scanf("%d", &k);printf("%d\n", k <= bsz ? query1(u, v, k) : query2(u, v, k));}return 0;
}

转载于:https://www.cnblogs.com/Juanzhang/p/10836533.html

http://www.lbrq.cn/news/1562077.html

相关文章:

  • 装饰公司营销型网站建设/西安关键词排名推广
  • 平顶山市建设委员会网站/郑州搜索引擎优化
  • 西安高校定制网站建设公司推荐/优化网站平台
  • 做游戏陪玩网站/推广文案范例
  • 网站建设市场分析报告/口碑营销案例ppt
  • 江苏句容市疫情最新情况/青岛seo网站关键词优化
  • 有人在相亲网站骗人做传销/单页面seo搜索引擎优化
  • 网站筛选功能/我在百度下的订单如何查询
  • 路由器 东莞网站建设/建站流程主要有哪些
  • 免费网站模板下载大全下载/百度快照是干嘛的
  • 网站开发有限公司/青岛seo外包公司
  • 企业网站主页设计图片/最热门的短期培训课程
  • 网站制作的基本流程/长沙优化网站推广
  • 2018爱情动做网站/2345浏览器主页网址
  • 做网站的前端是做什么/广州线下培训机构停课
  • 沈阳网站建设制作公司/安徽百度关键词优化
  • 网站建设二级分销/百度指数有哪些功能
  • 做ui要上那些网站/高端网站建设公司哪家好
  • 服装电子商务网站设计/怎么进行seo
  • 佛山广告设计公司排名/seo搜索引擎优化薪酬
  • 个人做网站流程图/百度pc端首页
  • 网站建设犭金手指C排名15/自己做网站设计制作
  • 手机在线设计/郑州百度seo排名公司
  • 北京 工业网站建设公司价格/代做seo关键词排名
  • 织梦网站怎样做防护/产品推广软件有哪些
  • 网站开发在线教程/友链是什么
  • 网站怎么做播放器/提高工作效率的软件
  • 设计师素材网站e/google推广公司哪家好
  • 珠海网络网站建设/百度秒收录神器
  • 个人网站可以做导购吗/广东公共广告20120708
  • 机器学习——PCA(主成分分析)降维
  • 18- 网络编程
  • AIoT浪潮之巅:AI如何赋能边缘物联网,解锁三大核心潜能
  • 第20章 LINQ 笔记
  • 具身智能Scaling Law缺失:机器人界的“摩尔定律“何时诞生?
  • LeetCode 分类刷题:2302. 统计得分小于 K 的子数组数目