P3591 [POI2015]ODW(分块)

P3591 [POI2015]ODW

给定一颗有nnn个节点的树,点有点权,给定一个长度为nnn的排列ppp,给定一个长度为n−1n - 1n1的数组ccc

我们会在树上进行n−1n - 1n1次行走,第iii次我们会从p[i]p[i]p[i]走到p[i+1]p[i + 1]p[i+1],步长为c[i]c[i]c[i],且走最短路,

当我们到p[i+1]p[i + 1]p[i+1]的距离小于c[i]c[i]c[i]的时候,我们会直接到点p[i+1]p[i + 1]p[i+1],对每次行走,我们要求出其所经过点的点权和。

由于nnn只有500005000050000,所以写一些比较暴力的算法,先选定根节点为111号节点:

如果c[i]c[i]c[i]大于n\sqrt nn,从p[i]p[i]p[i]p[i+1]p[i + 1]p[i+1],最多只要跳n\sqrt nn个点,所以,可以直接暴力跳,然后找第kkk代祖先,单次操作O(nlog⁡n)O(\sqrt n \log n)O(nlogn)的复杂度。

如果c[i]c[i]c[i]小于n\sqrt nn,我们定义sum[rt][len]sum[rt][len]sum[rt][len],表示从点rtrtrt向上跳步长为lenlenlen,跳出根节点的路径和,预处理这一步大概是O(nnlog⁡n)O(n \sqrt n \log \sqrt n)O(nnlogn)的复杂度。

之后只要求出lcalcalca,然后二分一下跳几次,在某条链上跳到哪,kkk代祖先找一下点,最后统计一下答案即可,整体复杂度O(nnlog⁡n)O(n \sqrt n \log n)O(nnlogn)

#include <bits/stdc++.h>using namespace std;const int N = 5e4 + 10;int head[N], to[N << 1], nex[N << 1], cnt = 1;int sz[N], son[N], fa[N], id[N], rk[N], top[N], dep[N], tot;int a[N], p[N], c[N], n, block;long long s[N][250];void add(int x, int y) {to[cnt] = y;nex[cnt] = head[x];head[x] = cnt++;
}void dfs1(int rt, int f) {fa[rt] = f, dep[rt] = dep[f] + 1, sz[rt] = 1;for (int i = head[rt]; i; i = nex[i]) {if (to[i] == f) {continue;}dfs1(to[i], rt);sz[rt] += sz[to[i]];if (!son[rt] || sz[to[i]] > sz[son[rt]]) {son[rt] = to[i];}} 
}void dfs2(int rt, int tp) {top[rt] = tp, id[rt] = ++tot, rk[tot] = rt;if (!son[rt]) {return ;}dfs2(son[rt], tp);for (int i = head[rt]; i; i = nex[i]) {if (to[i] == fa[rt] || to[i] == son[rt]) {continue;}dfs2(to[i], to[i]);}
}int lca(int x, int y) {while (top[x] != top[y]) {if (dep[top[x]] < dep[top[y]]) {swap(x, y);}x = fa[top[x]];}return dep[x] < dep[y] ? x : y;
}int k_fa(int rt, int k) {if (dep[rt] <= k) {return 0;}while (k > dep[rt] - dep[top[rt]]) {k -= dep[rt] - dep[top[rt]] + 1;rt = fa[top[rt]];}return rk[id[rt] - k];
}void dfs3(int rt, int fa) {for (int i = 1; i <= block; i++) {s[rt][i] = a[rt] + s[k_fa(rt, i)][i];}for (int i = head[rt]; i; i = nex[i]) {if (to[i] == fa) {continue;}dfs3(to[i], rt);}
}long long f1(int u, int v, int c) {// 暴力跳int f = lca(u, v);if (dep[u] < dep[v]) {swap(u, v);}int cur = u;long long ans = a[u];while (dep[cur] - dep[f] >= c) {cur = k_fa(cur, c);ans += a[cur];}if (v == f) {// 只有一条链if (cur != v) {ans += a[v];}return ans;}if (dep[cur] + dep[v] - 2 * dep[f] <= c) {// 不能跳到链的另一端ans += a[v];return ans;}cur = k_fa(v, dep[v] - dep[f] - (c - (dep[cur] - dep[f])));ans += a[cur];while (dep[v] - dep[cur] >= c) {cur = k_fa(v, dep[v] - dep[cur] - c);ans += a[cur];}if (cur != v) {ans += a[v];}return ans;
}long long f2(int u, int v, int c) {// 优化跳。int f = lca(u, v);if (dep[u] < dep[v]) {swap(u, v);}long long ans = 0;int steps = (dep[u] - dep[f]) / c, cur = k_fa(u, steps * c), now;ans += s[u][c] - s[cur][c] + a[cur];if (v == f) { // 只有一条链if (cur != v) {ans += a[v];}return ans;}if (dep[cur] + dep[v] - 2 * dep[f] <= c) {// 不能跳到链的另一端ans += a[v];return ans;}cur = k_fa(v, dep[v] - dep[f] - (c - (dep[cur] - dep[f])));steps = (dep[v] - dep[cur]) / c, now = k_fa(v, dep[v] - dep[cur] - steps * c);ans += s[now][c] - s[cur][c] + a[cur], cur = now;if (cur != v) {ans += a[v];}return ans;
}int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);scanf("%d", &n), block = sqrt(n);for (int i = 1; i <= n; i++) {scanf("%d", &a[i]);}for (int i = 1, u, v; i < n; i++) {scanf("%d %d", &u, &v);add(u, v);add(v, u);}for (int i = 1; i <= n; i++) {scanf("%d", &p[i]);}for (int i = 1; i < n; i++) {scanf("%d", &c[i]);}dfs1(1, 0);dfs2(1, 1);dfs3(1, 0);for (int i = 1; i < n; i++) {printf("%lld\n", c[i] > block ? f1(p[i], p[i + 1], c[i]) : f2(p[i], p[i + 1], c[i]));}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/313688.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

尝鲜体验 VS Code Python 原生 Jupyter Notebook 支持

9 月 21 日&#xff0c;PyCon China 2019 在上海举办。微软的 VS Code 发布了原生的Juypter Notebook 支持。 虽然要等到月底 Marketplace 里面才会正式更新&#xff0c;但 GitHub 上的 repo 已经包含了相应的 commit&#xff0c;所以还是可以通过手动安装的方式尝鲜。现有 VSC…

Java Web之filter、listener、Interceptor

** 1、Servlet ** Servlet 是服务端的 Java 应用程序&#xff0c;用于处理HTTP请求&#xff0c;做出相应的响应。 当客户端向服务器发出HTTP请求时&#xff0c;首先会由服务器中的 Web 容器&#xff08;如Tomcat&#xff09;对请求进行路由&#xff0c;交给该URL对应的 Servl…

L - Lookup Performance(主席树)

L - Lookup Performance 问对于一颗二叉搜索树来说&#xff0c;如果我们要找一个值域区间的值有多少个&#xff0c;他会向下递归查找几次&#xff0c; 设&#xff0c;第iii个节点所代表的最大最小值为li,ril_i, r_ili​,ri​&#xff0c;此时我们要查询L,RL, RL,R之间的值有多…

abp vNext微服务框架分析

abp vNext新框架的热度一直都很高&#xff0c;于是最近上手将vNext的微服务Demo做了一番研究。我的体验是&#xff0c;vNext的微服务架构确实比较成熟&#xff0c;但是十分难以上手&#xff0c;对于没有微服务开发经验的.net人员来说几乎是看不懂的&#xff0c;所以研究一番后再…

Java web之web.xml配置详解

什么是web.xml web.xml是web项目的配置文件&#xff0c;一般的web工程都会用到web.xml来配置&#xff0c;方便大型开发。web.xml主要用来配置Filter&#xff0c;Listener&#xff0c;Servlet等。但是web.xml并不是必须的&#xff0c;一个web工程可以没有web.xml文件。 web工程…

.NET Conf 2019日程(北京时间)

一年一度的 .NET Conf马上就要开始了,我将日程简易的翻译了一下,并且时间全部转换为北京时间,以方便国内.NETer.第1天 (北京时间9月24日).NET Conf 2019 基调 - Scott Hunter Mads Torgersen James Montemagno Olia Gavrysh Daniel Roth Glenn Condron Bri Achtman欢迎来到 .NE…

C - Swaps 2(树状数组,思维)

C - Swaps 2 给定两个长度为nnn的数组A,BA, BA,B&#xff0c;我们可以进行若干次如下操作&#xff0c;使AAA变成BBB&#xff0c; 选定i<ni < ni<n&#xff0c;将aia_iai​减小111&#xff0c;将ai1a_{i 1}ai1​增加111。交换ai,ai1a_i, a_{i 1}ai​,ai1​。 问我…

Hibernate基础

** 一、什么是Hibernate&#xff1f; **   Hibernate是一个轻量级的ORMapping框架   ORMapping原理&#xff08;Object Relational Mapping&#xff09; ORMapping基本对应规则&#xff1a; 1&#xff1a;类跟表相对应2&#xff1a;类的属性跟表的字段相对应3&#xff1…

进击的.NET 在云原生时代的蜕变

你一定看过这篇文章 《进击的 Java &#xff0c;云原生时代的蜕变》, 本篇文章的灵感来自于这篇文章。北京时间9.24 就将正式发布.NET Core 3.0, 所以写下这篇文章让大家全面认识.NET Core。.NET 生态系统是一个不断变化的生态圈&#xff0c;我相信它正在朝着一个伟大的方向发…

F. Strange Array(Codeforces Round #727 (Div. 2))(主席树)

F. Strange Array 给定一个长度为nnn的数组aaa&#xff0c;1≤ai≤n1 \leq a_i \leq n1≤ai​≤n&#xff0c;对于每个aia_iai​&#xff0c;我们要找到一个l≤i,r≥il \leq i, r \geq il≤i,r≥i&#xff0c; 使得&#xff0c;我们对区间[l,r][l, r][l,r]升序后&#xff0c;…

Hibernate懒加载问题的5种解决方案

** 1、Hibernate基础 ** Hibernate基础&#xff0c;传送门 ** 2、什么是Hibernate懒加载 ** 当我们查询一个对象的时候&#xff0c;在默认情况下&#xff0c;返回的只是该对象的代理对象&#xff0c;当用户去使用该对象的属性时&#xff0c;才会向数据库再一次发出查询语…

程序员过关斩将--要想获取我的用户信息,就得按照规矩来

菜菜君&#xff0c;我又来啦又有什么事吗&#xff1f;我按照你上篇文章写的JWT的方式已经把网站认证写完了&#xff0c;而且效果还不错那恭喜你呀&#xff0c;下次面试又多了一项技能不过&#xff0c;现在又有一个问题&#xff0c;我做的系统有一个合作商想要利用我们的用户信息…

E. Surprise me!(莫比乌斯反演 + 虚树 DP)

E. Surprise me! ∑i1n∑j1nϕ(aiaj)d(i,j)设paii∑i1n∑j1nϕ(ij)d(pi,pj)∑i1n∑j1nϕ(i)ϕ(j)ϕ(gcd⁡(i,j))gcd⁡(i,j)d(pi,pj)∑d1ndϕ(d)∑i1nd∑j1ndϕ(id)ϕ(jd)d(pid,pjd)[gcd⁡(i,j)1]∑d1ndϕ(d)∑k1ndμ(k)∑i1nkd∑j1nkdϕ(ikd)ϕ(jkd)d(pikd,pjkd)Tkd∑T1n(∑i1n…

Hibernate 的缓存机制

** 1、Hibernate 应用程序中按照缓存的范围&#xff0c;可以将缓存分为三类 ** &#xff08;1.1&#xff09;事务范围缓存&#xff08;单Session&#xff0c;即一级缓存&#xff09; 事务范围的缓存只能被当前事务访问&#xff0c;每个事务都有各自的缓存。缓存的生命周期依…

.NET分布式大规模计算利器-Orleans(一)

写在前面Orleans是基于Actor模型思想的.NET领域的框架&#xff0c;它提供了一种直接而简单的方法来构建分布式大规模计算应用程序&#xff0c;而无需学习和应用复杂的并发或其他扩展模式。我在2015年下半年开始应用Orleans&#xff0c;当时公司的交易系统采用的架构就是基于Orl…

吉哥系列故事——恨7不成妻(数位 DP)

吉哥系列故事——恨7不成妻 ∑i1n(presuc)2∑i1npre2suc22presucnpre2∑suc22pre∑suc\sum_{i 1} ^{n}(pre suc) ^ 2\\ \sum_{i 1} ^{n} pre ^ 2 suc ^ 2 2 \times pre \times suc\\ n \times pre ^ 2 \sum suc ^ 2 2 \times pre \sum suc\\ i1∑n​(presuc)2i1∑n​pre…

Hibernate与MyBatis对比

1、Hibernate与MyBatis简单介绍 Hibernate 是当前最流行的O/R mapping框架&#xff0c;它来自于 sf.net&#xff0c;现在已经成为Jboss的一部分。 Mybatis 是另外一种优秀的O/R mapping框架。目前属于apache的一个子项目。 MyBatis 参考资料官网&#xff1a;http://www.mybat…

Hive-DML详解(超详细)

文章目录 前言HiveQL的数据操作语言&#xff08;DML&#xff09;1. 插入数据1.1 直接插入固定值1.2 插入查询结果 2. 更新数据3. 删除数据3.1 删除整个分区 4. 查询数据4.1 基本查询4.2 条件筛选4.3 聚合函数 总结 前言 本文将介绍HiveQL的数据操作语言&#xff08;DML&#x…

从单机应用到微服务,用户认证走几步?

用户认证指在用户访问服务的时候确认用户的身份&#xff0c;受限于HTTP无状态的特性&#xff0c;应用开发者需要自行实现用户认证相关功能。通常是用户登录时服务端生成通行证返回给客户端&#xff0c;客户端在接下来的请求中携带通行证&#xff0c;然后服务端通过校验该通行证…

P5175 数列(矩阵快速幂)

P5175 数列 anb(xan−1yan−2)2x2an−12y2an−222xyan−1an−2x2an−12y2an−222xyan−2(xan−2yan−3)x2an−12y2an−222xy(xan−22yan−2an−3)a_n ^ b \left(x \times a_{n - 1} y \times a_{n - 2}\right) ^ 2\\ x ^ 2 \times a_{n - 1} ^ 2 y ^ 2 \times a_{n - 2} ^ 2…