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] 软件包管理器的更多相关文章

  1. [Luogu 2146] NOI2015 软件包管理器

    [Luogu 2146] NOI2015 软件包管理器 树剖好题. 通过对题目的分析发现,这些软件构成一棵树,\(0\) 是树根. 每下载一个软件,需要下载根到这个软件的路径上的所有软件: 每卸载一个 ...

  2. P2146 [NOI2015]软件包管理器

    题目链接:https://www.luogu.org/problemnew/show/P2146 题目描述 Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安 ...

  3. BZOJ4196:[NOI2015]软件包管理器——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=4196 https://www.luogu.org/problemnew/show/P2146 你决定 ...

  4. BZOJ 4196: [Noi2015]软件包管理器 [树链剖分 DFS序]

    4196: [Noi2015]软件包管理器 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1352  Solved: 780[Submit][Stat ...

  5. [BZOJ4196][NOI2015]软件包管理器

    4196: [Noi2015]软件包管理器 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1040  Solved: 603[Submit][Stat ...

  6. Mac 系统下类似于 apt-get 的软件包管理器 -- Homebrew

    对于一个习惯了在 Ubuntu 的终端上通过 apt-get 来安装工具软件的我来说,也希望在Mac上找到类似的工具,能很方便的一条命令就能安装所需的软件,而不用手工的去查找下载编译,或者是折腾安装所 ...

  7. BZOJ4196 软件包管理器

    Description Linux用户和OSX用户一定对软件包管理器不会陌生. 通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件源下载软件包,同时自动解决所有的依赖 ...

  8. 【NOI2015】软件包管理器

    NOI难得的水题,话说还是T2诶……又学到了线段树的一种新的魔性使用 看sxysxy大神的代码才写出来的,sxysxy_orz 原题: Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包 ...

  9. Chocolatey:Windows软件包管理器

    Chocolatey 2016-08-03 https://chocolatey.org/ Chocolatey是一个Windows软件包管理器,就像Nuget或者npm,或者说类似Linux上的ap ...

随机推荐

  1. 纯css实现移动端横向滑动列表&&overflow:atuo;隐藏滚动条

    <!DOCTYPE html> <html> <head> <title>横向滑动</title> <style type=" ...

  2. kubernetes核心组件kube-proxy

    一.  kube-proxy 和 service  kube-proxy是Kubernetes的核心组件,部署在每个Node节点上,它是实现Kubernetes Service的通信与负载均衡机制的重 ...

  3. 谷歌(Google)学术镜像,谷歌镜像

    谷歌(Google)学术镜像,谷歌镜像 2019-09-03 15:32:26 Hinton-wu 阅读数 6743 文章标签: 谷歌google学术镜像 更多 分类专栏: 其他   版权声明:本文为 ...

  4. java中针对 try和finally一些总结

    结论 1.不管有没有异常,finally中的代码都会执行 2.当try.catch中有return时,finally中的代码依然会继续执行 3.finally是在return后面的表达式运算之后执行的 ...

  5. 通过数组的某一个属性值进行排序(如id)

    let arr = [ {id: 1, name: 'aaa'}, {id: 4, name: 'ddd'}, {id: 2, name: 'bbb'}, {id: 3, name: 'ccc'} ] ...

  6. ES6--JavaScript扩展知识点(let、const、解构)

    一,ES2015(ES6)新增了两个声明变量的关键字:let.const let:只在代码块内{}有效,不可重复声明,不会提前初始化 1.只在代码块内有效 { let a = 1; var b = 2 ...

  7. vue语法概要二

    函数 用途 类别 v-html 用于输出html格式的数据 输出 v-bing 用于输出值 输出 v-model 双向绑定 输入和输出 v-if 逻辑判断 分支语句 v-else 同上 分支语句 v- ...

  8. LeetCode 【2】 Reverse Integer --007

    六月箴言 万物之中,希望最美:最美之物,永不凋零.—— 斯蒂芬·金 第二周算法记录 007 -- Reverse Integer (整数反转) 题干英文版: Given a 32-bit signed ...

  9. line 352 Error: Assertion failed (size.width>0 && size.height>0) in cv::imshow

    OpenCV 使用 createtrackerbar()报错问题 Error Error: Assertion failed (size.width>0 && size.heig ...

  10. 一组简单好看的css3渐变按钮

    主要代码如下: body { background:#fff } /* Mixins */ /* bg shortcodes */ .bg-gradient1 span,.bg-gradient1:b ...