【树链剖分】软件管理(luogu 2146/金牌导航 树链剖分-2)

正题

luogu 2146
金牌导航 树链剖分-2


题目大意

有若干软件,除了软件0,所有软件都依赖且只依赖于另外一个软件

当要删除一个软件时,所有依赖于该软件的软件都要删掉

当安装一个软件时,该软件依赖的软件都要安装

问你每次操作会影响多少个软件


解题思路

依赖连边会形成一棵树,

每次删除搜索子树,每次安装搜索到根节点的路径

到根节点的路径用树剖处理即可


代码

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define ll long long
#define N 100010
using namespace std;
int n, x, w, q, tot;
int v[N], fa[N], sz[N], ed[N], hs[N], anc[N], dep[N], head[N];
char str[100];
struct rec {int to, next;
} a[N];
void add(int x, int y) {a[++tot].to = y;a[tot].next = head[x];head[x] = tot;
}
struct Tree {
#define ls x * 2
#define rs x * 2 + 1int p[N << 2], s[N << 2], lazy[N << 2];void build(int x, int l, int r) {lazy[x] = -1;if (l == r)return;int mid = l + r >> 1;build(ls, l, mid);build(rs, mid + 1, r);return;}void up(int x) {s[x] = s[ls] + s[rs];return;}void down(int x, int l, int r) {if (lazy[x] != -1) {if (l < r) {int mid = l + r >> 1;lazy[ls] = lazy[rs] = lazy[x];s[ls] = lazy[x] * (mid - l + 1);s[rs] = lazy[x] * (r - mid);}lazy[x] = -1;}return;}void change(int x, int L, int R, int l, int r, int y) {if (L == l && R == r) {lazy[x] = y;s[x] = y * (r - l + 1);return;}down(x, L, R);int mid = L + R >> 1;if (r <= mid)change(ls, L, mid, l, r, y);else if (l > mid)change(rs, mid + 1, R, l, r, y);elsechange(ls, L, mid, l, mid, y), change(rs, mid + 1, R, mid + 1, r, y);up(x);}int ask(int x, int L, int R, int l, int r) {if (L == l && R == r)return s[x];down(x, L, R);int mid = L + R >> 1;if (r <= mid)return ask(ls, L, mid, l, r);else if (l > mid)return ask(rs, mid + 1, R, l, r);elsereturn ask(ls, L, mid, l, mid) + ask(rs, mid + 1, R, mid + 1, r);}
} T;
void dfs1(int x) {sz[x] = 1;for (int i = head[x]; i; i = a[i].next) {dep[a[i].to] = dep[x] + 1;fa[a[i].to] = x;dfs1(a[i].to);sz[x] += sz[a[i].to];if (sz[a[i].to] > sz[hs[x]])hs[x] = a[i].to;}return;
}
void dfs2(int x, int y) {anc[x] = y;v[x] = ++w;if (hs[x])dfs2(hs[x], y);for (int i = head[x]; i; i = a[i].next)if (a[i].to != hs[x])dfs2(a[i].to, a[i].to);ed[x] = w;
}
int solve(int x) {//到根节点的路径int sum = 0;while (anc[x] != 1) {sum += dep[x] - dep[anc[x]] + 1 - T.ask(1, 1, n, v[anc[x]], v[x]);T.change(1, 1, n, v[anc[x]], v[x], 1);x = fa[anc[x]];}sum += dep[x] - dep[anc[x]] + 1 - T.ask(1, 1, n, v[anc[x]], v[x]);T.change(1, 1, n, v[anc[x]], v[x], 1);return sum;
}
int solve2(int x) {//子树int sum = T.ask(1, 1, n, v[x], ed[x]);T.change(1, 1, n, v[x], ed[x], 0);return sum;
}
int main() {scanf("%d", &n);for (int i = 2; i <= n; ++i) {scanf("%d", &x);x++;add(x, i);}dfs1(1);dfs2(1, 1);scanf("%d", &q);while (q--) {scanf("%s%d", str + 1, &x);x++;if (str[1] == 'i')printf("%d\n", solve(x));elseprintf("%d\n", solve2(x));}return 0;
}

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

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

相关文章

【每日一题】7月14日题目精讲—压缩

来源&#xff1a;牛客网&#xff1a; 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format: %lld题目描述 给一个由小写字母组成的字符串&#xff0c;我们可以用一种简单的方法来压缩其中的重复…

P3306-[SDOI2013]随机数生成器【BSGS】

正题 题目链接:https://www.luogu.com.cn/problem/P3306 题目大意 给出一个p,a,b,x1,tp,a,b,x_1,tp,a,b,x1​,t&#xff0c;有xiaxi−1bx_iax_{i-1}bxi​axi−1​b 求一个最小的nnn使得xntx_ntxn​t 解题思路 下标缩一下先变成x0x_0x0​会更好算一点&#xff0c;只考虑x0x_0…

【DevOps+LIVE】直播复盘 – DevOps能力成长模型2018首发

昨天晚上小编和DevOpsDays中国核心组织者刘征老师和张乐老师一起嗨了一把&#xff0c;本来规划进行1小时的直播结果延长到了2个小时才结束&#xff0c;观众人数在前半段一直处于增长状态&#xff0c;直到开播一小时到达顶峰。小伙伴也非常给力&#xff0c;一共提出了40多个问题…

Codeforces Round #658 (Div. 2)

A - Common Subsequence 最短相同子序列长度肯定为1&#xff0c;如果一个元素都不相等之间不存在相同子序列 #define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #define debug(x) cout<<#x<<": "<<x<<" " #include…

【树链剖分】染色(luogu 2486/金牌导航 树链剖分-3)

正题 luogu 2486 金牌导航 树链剖分-3 题目大意 给你一棵树&#xff0c;让你进行以下操作&#xff1a; 1.把一条路径染上一个颜色 2.查询一条路径上有多少个颜色段 解题思路 用树链剖分把问题转化为链上问题 然后维护一下左右端点颜色和颜色总数就好了 代码 #include<c…

小小粉刷匠

来源&#xff1a;牛客网&#xff1a; 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 32768K&#xff0c;其他语言65536K 64bit IO Format: %lld题目描述 “lalala,我是一个快乐的粉刷匠”,小名一边快活地唱着歌,一边开心地刷着墙",兴致突…

P5363-[SDOI2019]移动金币【阶梯博弈,dp,组合数学】

正题 题目链接:https://www.luogu.com.cn/problem/P5363 题目大意 1n1\times n1n的网格上有mmm个硬币&#xff0c;两个人轮流向前移动一个硬币但是不能超过前一个硬币&#xff0c;无法移动者输。 求有多少种情况先手必胜。 解题思路 竟然有我会的题&#xff0c;我感动 位置做…

M-SOLUTIONS Programming Contest 2020总结

A - Kyu in AtCoder 直接模拟 #define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #define debug(x) cout<<#x<<": "<<x<<" " #include<iostream> #include<algorithm> using namespace std; int main(…

Emit动态代理.NetCore迁移之旅

前言】前面我们介绍了Aop 从静态代理到动态代理&#xff1a;https://www.cnblogs.com/7tiny/p/9657451.html我们在.NetFramework平台下使用微软提供的Emit技术实现了动态代理类的生成。但是.NetCore作为微软.Net平台的春天&#xff0c;如果类库光支持.NetFramework&#xff0c;…

【LCT】弹飞绵羊(luogu 3203/金牌导航 LCT-2)

正题 luogu 3203 金牌导航 LCT-2 题目大意 给你n个格子&#xff0c;当你在第i个格子时&#xff0c;可以往后跳aia_iai​格&#xff0c;让你进行几下操作&#xff1a; 1.修改第i个数 2.查询在第i个格子跳多少下会跳出界 解题思路 往后跳相当于连接格子&#xff0c;由此建立一…

【每日一题】7月15日题目精讲—生日快乐

【每日一题】7月15日题目精讲—生日快乐 [SCOI2009]生日快乐 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format: %lld题目描述 windy的生日到了&#xff0c;为了庆祝生日&#xff0c;他的朋友…

P1712-[NOI2016]区间【线段树,尺取法】

正题 题目链接:https://www.luogu.com.cn/problem/P1712 题目大意 nnn个区间&#xff0c;求出其中mmm个区间使得它们有覆盖同一个点且最长区间长度减去最短长度最小。 解题思路 因为是最接近的mmm个&#xff0c;考虑一种叫尺取法的做法。 先把区间按照长度排序&#xff0c;每…

Codeforces Round #659 (Div. 2)

日常爆零掉分wa A. Common Prefixes 根据前一个字符串构造后一个字符串&#xff0c;从哪不同就从哪换 #define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #define debug(x) cout<<#x<<": "<<x<<" " #include<i…

asp.net core结合Gitlab-CI实现自动化部署

一、前言在之前的文章中写过k8sJenkinsGitLab-自动化部署asp.net core项目 的topic&#xff0c;这次讲解一下gitlab-ci的CI/CD&#xff0c;说实话&#xff0c;自动化部署是在是非常的舒服&#xff0c;而且gitlab-ci很适合中小项目的部署&#xff0c;大项目推荐使用k8s。阅读目录…

【LCT】城市旅行(luogu 4842/金牌导航 LCT-3)

正题 luogu 4842 金牌导航 LCT-3 题目大意 给你一棵树&#xff0c;让你进行一些操作&#xff1a; 1.删除一条边 2.连接一条边 3.给一条路径上的点加上x 4.给出一条路径&#xff0c;在该路径选取两个点&#xff0c;求这两个点之间路径的权值和的期望值 解题思路 该树可以用LC…

P6329-[模板]点分树 | 震波

正题 题目链接:https://www.luogu.com.cn/problem/P6329 解题思路 给出nnn个点的一棵树&#xff0c;每个点有权值&#xff0c;有mmm次操作 修改一个点xxx的权值为yyy询问距离点xxx不超过kkk的所有点点权和 解题思路 点分树的模板题&#xff0c;先点分治构造出点分树&#x…

Codeforces Round #660 (Div. 2)

A - Captain Flint and Crew Recruitment 刚开始还想筛法求质数&#xff0c;最后发现是个脑筋急转弯 #define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #define debug(x) cout<<#x<<": "<<x<<" " #include<ios…

[译]ABP vNext介绍

译者注ASP.NET Boilerplate是.Net平台非常优秀的一个开源Web应用程序框架,在国内也有大量的粉丝.近日, 本人在github上闲逛, 发现ASP.NET Boilerplate团队又悄悄的建立了一个新项目: ABP vNext从名称可以看出来, 这是ASP.NET Boilerplate的下一代框架. 那么, 为什么要开发这个新…

[HAOI2008]玩具取名

[HAOI2008]玩具取名 文章目录题目描述输出描述:题解代码&#xff1a;时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format: %lld题目描述 某人有一套玩具&#xff0c;并想法给玩具命名。首先他选…

【KMP】重复子串(ybtoj KMP-2)

正题 ybtoj KMP-2 题目大意 问你一个字符串最多由多少个相同的字符串组合而成 解题思路 如下图&#xff0c;先用KMP求出nx数组&#xff0c;那么有1∼nxn1\sim nx_n1∼nxn​和(n−nxn)∼n(n-nx_n)\sim n(n−nxn​)∼n相匹配 不难推出1∼(n−nxn)1\sim (n-nx_n)1∼(n−nxn​)…