P4175 [CTSC2008]网络管理(整体二分)

P4175 [CTSC2008]网络管理

给定一棵有nnn个节点的树,点有点权,有两种操作:① 修改某个点的点权,② 查询两点路径间的点权第kkk大。

给定u,vu, vu,v,选定111号节点为根节点,设inf(x)inf(x)inf(x)表示从根节点到点xxx的信息,两点间的信息可以描述为inf(u)+inf(v)−inf(lca(u,v))−fa(inf(lca(u,v)))inf(u) + inf(v) - inf(lca(u, v)) - fa(inf(lca(u, v)))inf(u)+inf(v)inf(lca(u,v))fa(inf(lca(u,v)))

由此我们可以把树上每个点拆成[l,r,x][l, r, x][l,r,x]lll为这个点进入dfsdfsdfsdfsdfsdfs序,rrr为这个点走出dfsdfsdfsdfsdfsdfs序,

我们要查找inf(u)inf(u)inf(u)上的信息就只要查找有多少个[l,r,x][l, r, x][l,r,x]满足l≤dfn(u)≤rl \leq dfn(u) \leq rldfn(u)r,树状数组区间更新,单点查询就好了。

对于每个询问可以写成u,v,lca(u,v),fa(lca(u,v))u, v, lca(u, v), fa(lca(u, v))u,v,lca(u,v),fa(lca(u,v)),我们把树上的点,修改操作,询问操作放到数组中整体二分一下即可。

(感觉代码好像比树套树好写一点点……)

#include <bits/stdc++.h>using namespace std;const int N = 2e5 + 10;int head[N], to[N], nex[N], cnt = 1;int a[N], ans[N], n, m;int son[N], fa[N], l[N], dep[N], r[N], sz[N], top[N], sum[N], tot;struct Res {int l, r, f, ff, x, id, type;
}q[N], q1[N], q2[N];void add(int x, int y) {to[cnt] = y;nex[cnt] = head[x];head[x] = cnt++;
}void dfs1(int rt, int f) {dep[rt] = dep[f] + 1, fa[rt] = f, sz[rt] = 1, l[rt] = ++tot;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];}}r[rt] = tot;
}void dfs2(int rt, int tp) {top[rt] = tp;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;
}inline int lowbit(int x) {return x & (-x);
}void update(int rt, int v) {while (rt <= N) {sum[rt] += v;rt += lowbit(rt);}
}int query(int rt) {int ans = 0;while (rt) {ans += sum[rt];rt -= lowbit(rt);}return ans;
}void solve(int l, int r, int L, int R) {if (l > r || L > R) {return ;}if (l == r) {for (int i = L; i <= R; i++) {if (q[i].type == 2) {ans[q[i].id] = l;}}return ;}int mid = l + r >> 1, cnt1 = 0, cnt2 = 0;for (int i = L; i <= R; i++) {if (q[i].type == 1) {if (q[i].x <= mid) {int l = q[i].l, r = q[i].r;update(l, q[i].id), update(r + 1, -q[i].id);q1[++cnt1] = q[i];}else {q2[++cnt2] = q[i];}}else {int cur = query(q[i].l) + query(q[i].r) - query(q[i].f) - query(q[i].ff);if (cur >= q[i].x) {q1[++cnt1] = q[i];}else {q[i].x -= cur;q2[++cnt2] = q[i];}}}for (int i = 1; i <= cnt1; i++) {if (q1[i].type == 1) {int l = q1[i].l, r = q1[i].r;update(l, -q1[i].id), update(r + 1, q1[i].id);}}for (int i = 1; i <= cnt1; i++) {q[L + i - 1] = q1[i];}for (int i = 1; i <= cnt2; i++) {q[L + cnt1 + i - 1] = q2[i];}solve(l, mid, L, L + cnt1 - 1), solve(mid + 1, r, L + cnt1, R);
}int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);scanf("%d %d", &n, &m);for (int i = 1; i <= n; i++) {scanf("%d", &a[i]);}for (int i = 1, x, y; i < n; i++) {scanf("%d %d", &x, &y);add(x, y);add(y, x);}dfs1(1, 0);dfs2(1, 1);for (int i = 1; i <= m; i++) {ans[i] = 1000000000;}int num = 0;for (int i = 1; i <= n; i++) {q[++num] = {l[i], r[i], 0, 0, a[i], 1, 1};}for (int i = 1, k, x, y; i <= m; i++) {scanf("%d %d %d", &k, &x, &y);if (!k) {q[++num] = {l[x], r[x], 0, 0, a[x], -1, 1};a[x] = y;q[++num] = {l[x], r[x], 0, 0, a[x], 1, 1};}else {int f = lca(x, y), ff = fa[f], sum = dep[x] + dep[y] - dep[f] - dep[ff];if (sum >= k) {q[++num] = {l[x], l[y], l[f], l[ff], sum - k + 1, i, 2};}else {ans[i] = -1;}}}solve(0, 100000000, 1, num);for (int i = 1; i <= m; i++) {if (ans[i] != 1000000000) {if (ans[i] == -1) {puts("invalid request!");}else {printf("%d\n", ans[i]);}}}return 0;
}

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

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

相关文章

深入理解 JVM Class文件格式(六)

经过前几篇文章&#xff0c; 终于将常量池介绍完了&#xff0c; 之所以花这么大的功夫介绍常量池&#xff0c; 是因为对于理解class文件格式&#xff0c;常量池是必须要了解的&#xff0c; 因为class文件中其他地方&#xff0c;大量引用了常量池中的数据项。 对于还不了解常量池…

远程开发初探 - VS Code Remote Development

如果你是学生&#xff0c;你还在你的 windows 电脑上为各种环境配置头疼的时候&#xff0c;你应该了解一下 Remote Development。如果你喜欢 linux 的开发环境和舒适的 shell&#xff0c;但却不舍得抛弃 windows/macos 图形界面给你带来的用户体验和一些软件的兼容(QQ, 微信), …

深入理解 JVM Class文件格式(七)

本专栏列前面的一系列博客&#xff0c; 对Class文件中的一部分数据项进行了介绍。 本文将会继续介绍class文件中未讲解的信息。 先回顾一下上面一篇文章。 在上一篇博客中&#xff0c; 我们介绍了&#xff1a; this_class 对当前类的描述 super_class 对当前类的超类的描述 in…

P3250 [HNOI2016]网络(整体二分)

P3250 [HNOI2016]网络 给定一棵树&#xff0c;有三种操作&#xff1a; 给定u,v,wu, v, wu,v,w&#xff0c;表示u,vu, vu,v路径上有一个重要度为www的请求&#xff0c;给定ttt&#xff0c;第ttt个发生的请求结束&#xff0c;给定一个xxx&#xff0c;假设xxx发生故障&#xff0…

微信小程序集成腾讯云 IM SDK

1、背景因业务功能需求需要接入IM&#xff08;即时聊天&#xff09;功能&#xff0c;一开始想到的是使用 WebSocket 来实现这个功能&#xff0c;然天意捉弄&#xff08;哈哈&#xff09;服务器版本太低不支持 wx 协议&#xff08;也就不支持 WebSocket了&#xff09;不得不寻找…

深入理解 JVM Class文件格式(八)

在本专栏的第一篇文章 深入理解Java虚拟机到底是什么 中&#xff0c; 我们主要讲解了什么是虚拟机&#xff0c; 这篇博客是对JVM的一个概述。 在随后的几篇文章中&#xff0c;一直在讲解class文件格式。 在今天这篇博客中&#xff0c; 将会继续讲解class文件中的其他信息。 在本…

Function!(计蒜客 - 42386)

Function! fa(x)ax(a>0,a≠1)f_a(x) a ^ x(a > 0, \ a \neq 1)fa​(x)ax(a>0, a​1)&#xff0c;我们要求∑a2n(a∑ban⌊fa−1(b)⌋⌈fb−1(a)⌉)\sum\limits_{a 2} ^{n} \left(a \sum\limits_{b a} ^{n} \lfloor f_a ^{-1}(b) \rfloor \lceil f_b ^{-1}(a) \rce…

深入理解 JVM Class文件格式(九)

经过前八篇关于class文件的博客&#xff0c; 关于class文件格式的内容也基本上讲完了。 本文是关于class文件格式的最后一篇。 在这篇博客中&#xff0c; 将会讲解关于方法的几个属性。 理解这篇博客的内容&#xff0c; 对于理解JVM执行引擎起着重要作用。 关于虚拟机执行引擎有…

MongoDB入门及 c# .netcore客户端MongoDB.Driver2.9.1使用

MongoDB 是一个基于分布式文件存储的数据库。由 C 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。什么场景下使用MongoDBMongoDB虽然是NoSQL(非关系型的数据库)&#xff0c;但是实际使用的时候可以当做关系型数据库来用&#xff0c;mysql等数据库中单表数据量…

#4604. The kth maximum number(整体二分 + 树套树)

#4604. The kth maximum number 给定一个大小不超过51055 \times 10 ^ 55105的矩形区域&#xff0c;有一些点有点权。 每次询问给定x1,y1,x2,y2,kx_1, y_1, x_2, y_2, kx1​,y1​,x2​,y2​,k问以x1,y1x_1, y_1x1​,y1​为右下角&#xff0c;x2,y2x_2, y_2x2​,y2​为左上角的…

深入理解 JVM Class文件格式(十)

到此&#xff0c; 所有关于class文件格式的重要内容都已经讲解完了&#xff0c; 不敢说面面俱到&#xff0c; 但是敢说大部分重要的内容都包含在内了。前前后后用了9篇博客来专门讲解class文件结构&#xff0c; 为什么花那么多的时间和精力来介绍class文件呢&#xff1f; 简而言…

《WTM送书活动:向更遥远的星辰大海起航~》

点击上方蓝字关注我们吧是的,没错~这一篇不是大老刘写的 哈哈~啥? 你想知道为啥? 大老刘为了你们不加班,熬夜改BUG,姑娘不乐意了...然后...后面请自行脑补~哎~生活还要继续鸭....那么,接下来由我陪大家唠一段儿~ 单口...各位看官老爷们:注意了!第一件事情呢我们的WTM框…

P4602 [CTSC2018]混合果汁(主席树)

P4602 [CTSC2018]混合果汁 共有nnn种果汁&#xff0c;第iii种果汁的美味度为did_idi​&#xff0c;每升价格为pip_ipi​&#xff0c;在一瓶混合果汁中&#xff0c;最多只能添加lil_ili​升。 有mmm个询问&#xff0c;每次询问给出两个数g,Lg, Lg,L&#xff0c;我们要找出价格…

Java中的对象一定在堆上分配吗?

首先&#xff0c;为解释这个问题&#xff0c;需要的基本知识如下&#xff08;如果对以下概念不太熟悉&#xff0c; 可以先了解下&#xff09;&#xff1a; 1.JVM内存结构&#xff0c;传送门 2.即时编译&#xff08;JIT&#xff09;&#xff0c;传送门 3. 逃逸分析&#xff0c;…

最全的 netcore 3.0 升级实战方案

1、哈喽大家中秋节&#xff08;后&#xff09;好呀&#xff01;感觉已经好久没有写文章了&#xff0c;但是也没有偷懒哟&#xff0c;我的视频教程《系列一、NetCore 视频教程&#xff08;Blog.Core&#xff09;》也已经录制八期了&#xff0c;还在每周末同步更新中&#xff0c;…

H - Hello Ms. Ze(树状数组套主席树,线段树上二分)

H - Hello Ms. Ze 给定nnn种不同的材料&#xff0c;第iii种材料有aia_iai​个&#xff0c;有mmm个操作&#xff0c;操作分为两类&#xff1a; 把第xxx种材料修改为yyy个&#xff0c;只用[l,r][l, r][l,r]区间的材料制作衣服&#xff0c;每件衣服要用kkk个不同的材料&#xff…

JVM——逃逸分析

首先&#xff0c;为解释这个问题&#xff0c;需要的基本知识如下&#xff08;如果对以下概念不太熟悉&#xff0c; 可以先Google下&#xff09;&#xff1a; 1.JVM内存结构&#xff0c;传送门 2.即时编译&#xff08;JIT&#xff09;&#xff0c;传送门 逃逸分析 在编译期间…

ASP.NET Core SignalR:集线器Hub

一、什么是集线器hubs通过SignalR的集线器hubs中定义的方法&#xff0c;服务器可以调用连接中的客户端定义的方法&#xff0c;而客户端也可以调用服务器端集线器中定义的方法。SignalR负责实现了客户端和服务器之间的实时通信。二、配置SignalR的hubsSignalR通过在Startup.Conf…

P6271 [湖北省队互测2014]一个人的数论(莫比乌斯反演 + 伯努利数)

P6271 [湖北省队互测2014]一个人的数论 ∑i1nim[gcd⁡(i,n)1]∑d∣nμ(d)dm∑i1ndim由伯努利数可知∑i0nim1m1∑i0mCm1iBi(n1)m−i1设fi1m1Bm−i1Cm1i,则有∑d∣nμ(d)dm(∑i1m1fi(nd)i(nd)m)∑i1m1fini∑d∣nμ(d)dm−i(nm∑d∣nμ(d))考虑后项∑d∣nμ(d)dm−i&#xff0c;迪…

Java面试题汇总

1、综合素质层面 个人介绍、离职原因、兴趣爱好等 https://mp.weixin.qq.com/s?__bizMzI3NzE0NjcwMg&mid2650121143&idx2&snf4c4f26bc5d2132352f12d28c8cb2264&chksmf36bbe96c41c3780d8086adec7be8737ce3718db9c2a7fa33aa7591f8ae179ed3240286f3886&scen…