[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 ...
随机推荐
- 原生js分页器插件
window.page = function page(ele, para) { this.ele = document.querySelector(ele); this.options = { co ...
- MySQL NULL 使用带来的坑
MySQL 基础篇 三范式 MySQL 军规 MySQL 配置 MySQL 用户管理和权限设置 MySQL 常用函数介绍 MySQL 字段类型介绍 MySQL 多列排序 MySQL 行转列 列转行 M ...
- C#类型转换工具类
using System; namespace Com.AppCode.Extend { public static partial class Ext { #region 数值转换 /// < ...
- 01背包变种 第k解问题 hdu 2639
先说说普通01包的状态问题吧 普通的01背包,在状态转移的过程中为了求出最优解,一定是遍历了所有的情况 然后再求的最优解.那么对于第k最优解问题,我们只需要再加一个维度,用来记录每一个状态k优解的状态 ...
- JVM内存结构划分
JVM内存结构划分 JVM内存结构划分 数据区域划分 程序计数器 虚拟机栈 本地方法栈 堆 方法区 运行时常量池 StringTable 直接内存 创建新对象说明 对象的创建 对象的内存布局 对象头 ...
- bootstrap下拉框保持打开
$(".dropdown-menu li").on("click", function (e) { e.stopPropagation(); }); 停止传播事 ...
- zabbix-通过自动注册自动添加主机
自动注册和自动发现可以实现一样的效果,就是自动添加符合条件的主机到监控,那跟自动发现有什么区别? 其实自动发现是由弊端的,上文也说到了,zabbix server是主动去扫描网段,寻找agent的,试 ...
- nginx搭建反向代理服务器详解
一.反向代理:Web服务器的“经纪人” 1.1 反向代理初印象 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从 ...
- codeblocks glfw glew glm 配置
Code in code::blocks Download Mini project in c,c++,c# ,OpenGL,GLUT,GLFW,windows form application so ...
- Install RabbitMQ on CentOS 7
NOTE: this article is only for CentOS 7 How to Install RabbitMQ on CentOS 7 yum update Install erlan ...