[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 ...
随机推荐
- 一个农民工自学java找到工作的励志故事
<!-----------------------------------------------------------------------------摘自网络-------------- ...
- MySQL SELECT表达式的执行顺序是从左往右依次执行
例子如下:(确保这几个变量都是初次使用,因为mysql的用户自定义变量会在整个连接session中存在) ,,; +--------+-------+---------+-------+ | +--- ...
- 题解 P3378 【【模板】堆】
Update 18.2.27----想当年我还用着C..... 看到题解里一堆用C++ STL库中的优先队列,身为C语言选手心里不是滋味 故手打一个优先队列献给坚守在C语言的选手 #include & ...
- XXX银行人事管理系统-数据库设计
1. 用户.权限.角色关系用户基本信息 userinfo [人员表]权限表actions[权限表]员工类型表usertype [管理组表]权限映射表actionmapping [权限映射表]权限分栏表 ...
- python运行报错:cannot import name 'InteractiveConsole'
ModuleNotFoundError: No module named '_pydevd_bundle.pydevd_cython' ImportError: cannot import name ...
- optparser模块 与 ZIP爆破(Python)
optparser模块: 为脚本传递命令参数. 初始化: 带 Usage 选项(-h 的显示内容 Usage:): >>> from optparse import OptionPa ...
- vue slot的使用(transform动画)
slot的说明就看vue的官方文档 但是有点模糊 理解: 是对组件的扩展,通过slot插槽向组件内部指定位置传递内容,通过slot可以父子传参: 解决什么问题:正常情况下,<Child&g ...
- canvas验证码实现
1 <!DOCTYPE html> <html> <!-- head --> <head> <meta charset="utf-8&q ...
- 8.Redis的复制(Master/Slave)
Redis的复制(Master/Slave) a)是什么 行话:也就是我们所说的主从复制,主机数据更新后根据配置和策略,自动同步到备机的master/slaver机制,Master以写为主,Slave ...
- SmartBinding工作原理分析
关于kbmMW SmartBinding,我翻译了作者写的几篇文章,其强大的绑定机制,将可视控制与各种数据源灵活绑定在一起,实现了类似DBEdit数据敏感控件的效果,可以及大的减少我们的代码,实现界面 ...