[Luogu] 软件包管理器
https://www.luogu.org/problemnew/show/P2146
几乎是一个裸题
#include<cstdio>
#include<cstring>
#include<algorithm> #define ls (p << 1)
#define rs ((p << 1) | 1)
#define mid ((l + r) >> 1) const int N = , M = N << ;
using namespace std; int n, Q, last[N], pre[N], now[N], son[N], tot, a[N], cnt, w[N], size[N];
int hson[N], top[N], fa[N], dep[N];
char op[]; struct Tree {
int sum[M], cov[M], size[M];
void down(int p) {
if (cov[p] != -) {
sum[ls] = size[ls] * cov[p], sum[rs] = size[rs] * cov[p];
cov[ls] = cov[rs] = cov[p], cov[p] = -;
}
}
void build(int p, int l, int r) {
if (l == r) {
sum[p] = , cov[p] = -, size[p] = ;
return;
}
build(ls, l, mid), build(rs, mid + , r);
sum[p] = sum[ls] + sum[rs], size[p] = size[ls] + size[rs];
}
void change(int p, int l, int r, int a, int b, int v) {
if (l == a && r == b) {
sum[p] = v * size[p], cov[p] = v;
return;
}
down(p);
if (b <= mid) change(ls, l, mid, a, b, v);
else if (a > mid) change(rs, mid + , r, a, b, v);
else change(ls, l, mid, a, mid, v), change(rs, mid + , r, mid + , b, v);
sum[p] = sum[ls] + sum[rs];
}
int query(int p, int l, int r, int a, int b) {
if (l == a && r == b) {
return sum[p];
}
down(p);
if (b <= mid) return query(ls, l, mid, a, b);
else if (a > mid) return query(rs, mid + , r, a, b);
else return query(ls, l, mid, a, mid) + query(rs, mid + , r, mid + , b);
}
} Seg; void add(int a, int b) {
pre[++ tot] = now[a], now[a] = tot, son[tot] = b;
}
void dfs(int x) {
size[x] = ;
for (int y = now[x]; y; y = pre[y])
if (son[y] != fa[x]) {
fa[son[y]] = x, dep[son[y]] = dep[x] + ;
dfs(son[y]), size[x] += size[son[y]];
if (size[son[y]] > size[hson[x]]) hson[x] = son[y];
}
} void btree(int x, int tp) {
w[x] = ++ cnt, a[cnt] = , top[x] = tp;
if (hson[x]) btree(hson[x], tp);
for (int y = now[x]; y; y = pre[y])
if (son[y] != fa[x] && son[y] != hson[x])
btree(son[y], son[y]);
last[x] = cnt;
} void answer(int a,int b) {
int f1 = top[a], f2 = top[b], sum = , num = dep[b] - dep[a] + ;
while (f1 != f2) {
if (dep[f1] < dep[f2]) swap(f1, f2), swap(a, b);
sum += Seg.query(, , n, w[f1], w[a]);
Seg.change(, , n, w[f1], w[a], );
a = fa[f1], f1 = top[a];
}
if (dep[a] > dep[b]) swap(a, b);
sum += Seg.query(, , n, w[a], w[b]);
Seg.change(, , n, w[a], w[b], );
printf("%d\n", num - sum);
} int main() {
scanf("%d", &n);
for (int i = , x; i <= n; i ++) scanf("%d", &x), x ++, add(x, i);
dfs(), btree(, ), Seg.build(, , n);
scanf("%d", &Q);
for (int i = , x; i <= Q; i ++) {
scanf("%s%d", op, &x), x ++;
if (op[] == 'i') answer(, x);
else {
printf("%d\n", Seg.query(, , n, w[x], last[x]));
Seg.change(, , n, w[x], last[x], );
}
}
return ;
}
[Luogu] 软件包管理器的更多相关文章
- [Luogu 2146] NOI2015 软件包管理器
[Luogu 2146] NOI2015 软件包管理器 树剖好题. 通过对题目的分析发现,这些软件构成一棵树,\(0\) 是树根. 每下载一个软件,需要下载根到这个软件的路径上的所有软件: 每卸载一个 ...
- P2146 [NOI2015]软件包管理器
题目链接:https://www.luogu.org/problemnew/show/P2146 题目描述 Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安 ...
- BZOJ4196:[NOI2015]软件包管理器——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=4196 https://www.luogu.org/problemnew/show/P2146 你决定 ...
- BZOJ 4196: [Noi2015]软件包管理器 [树链剖分 DFS序]
4196: [Noi2015]软件包管理器 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1352 Solved: 780[Submit][Stat ...
- [BZOJ4196][NOI2015]软件包管理器
4196: [Noi2015]软件包管理器 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1040 Solved: 603[Submit][Stat ...
- Mac 系统下类似于 apt-get 的软件包管理器 -- Homebrew
对于一个习惯了在 Ubuntu 的终端上通过 apt-get 来安装工具软件的我来说,也希望在Mac上找到类似的工具,能很方便的一条命令就能安装所需的软件,而不用手工的去查找下载编译,或者是折腾安装所 ...
- BZOJ4196 软件包管理器
Description Linux用户和OSX用户一定对软件包管理器不会陌生. 通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件源下载软件包,同时自动解决所有的依赖 ...
- 【NOI2015】软件包管理器
NOI难得的水题,话说还是T2诶……又学到了线段树的一种新的魔性使用 看sxysxy大神的代码才写出来的,sxysxy_orz 原题: Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包 ...
- Chocolatey:Windows软件包管理器
Chocolatey 2016-08-03 https://chocolatey.org/ Chocolatey是一个Windows软件包管理器,就像Nuget或者npm,或者说类似Linux上的ap ...
随机推荐
- go if 便捷语句
之前使用java C#没这么用过. 绝对新技能 if v := math.Pow(x, n); v < lim { 跟 for 一样,`if` 语句可以在条件之前执行一个简单的语句. 由这个语 ...
- Python开发【第三章】:函数介绍
一. 函数介绍 1.函数是什么? 在学习函数之前,一直遵循面向过程编程,即根据业务逻辑从上到下实现功能,其往往用一长段代码来实现指定功能,开发过程中最常见的操作就是粘贴复制,也就是将之前实现的代码块复 ...
- Linux 编译kernel有关Kconfig文件详解
ref : https://blog.csdn.net/Ultraman_hs/article/details/52984929 Kconfig的格式 下面截取/drivers/net下的Kconfi ...
- docker相关--dockerd日志设置
背景 线上容器dockerd的后台程序打印了超过几十G的日志 Docker daemon日志的位置: Docker daemon日志的位置,根据系统不同各不相同. Ubuntu - /var/log/ ...
- C#的@标志的使用情况—本篇blog采用Markdown编写
@(C# 参考--出自官方文档入口) 1.使 C# 关键字用作标识符. @ 字符可作为代码元素的前缀,编译器将把此代码元素解释为标识符而非 C# 关键字. 下面的示例使用 @ 字符定义其在 for 循 ...
- CLSID 为 {00024500-0000-0000-C000-000000000046} 的组件失败
今天在使用 C# 操作 Excel 时,一直在报错误: 检索 COM 类工厂中 CLSID 为 {00024500-0000-0000-C000-000000000046} 的组件失败,原因是出现以下 ...
- Cause: com.mysql.jdbc.PacketTooBigException: Packet for query is too large (16944839 > 16777216). You can change this value on the server by setting the max_allowed_packet' variable.
今天发现task微服务的error日志报如下错误: Cause: com.mysql.jdbc.PacketTooBigException: Packet for query is too large ...
- Java 之 泛型
一.泛型概述 集合中是可以存放任意对象的,只要把对象存储集合后,那么这时他们都会被提升成 Object 类型.当我们取出一个对象,并且进行相应的操作,这时必须采用类型转换. 先观察下面代码: publ ...
- FPGA上外挂DDR2&DDR3&MIG IP的使用记录
前言 当需要大容量数据存储及处理的时候,FPGA内部自带的存储资源是远远不够的,所以问题来了,怎么使用外带的DDR3? 首要问题在于DDR3是什么?有没有协议?当然只是需要用Xilinx MIG IP ...
- STL源码剖析 - RB-tree
在我看来,看源码是一件既痛苦又兴奋的事.当我们在推敲其中的难点时,是及其痛苦的,但当发现实现代码是那么丝滑简洁时,“wc, nb!”. 1. 导语 如果我们去看关联式容器map.set.multima ...