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. 解决 org.apache.ibatis.binding.BindingException: Invalid bound statement (not found) 以及MyBatis批量加载xml映射文件的方式

    错误 org.apache.ibatis.binding.BindingException: Invalid bound statement (not found) 的出现,意味着项目需要xml文件来 ...

  2. Java 中的锁原理、锁优化、CAS、AQS 详解!

    来源:jianshu.com/p/e674ee68fd3f 1.为什么要用锁? 锁-是为了解决并发操作引起的脏读.数据不一致的问题. 2.锁实现的基本原理 2.1.volatile Java编程语言允 ...

  3. Base64编码为什么会使数据量变大

    现在工作中把视频转成base64发现数据量过大无法下载. 1.为什么base64编码会使数据量变大呢? Base64编码的思想是是采用64个基本的ASCII码字符对数据进行重新编码.它将需要编码的数据 ...

  4. (一)Redis之简介和windows下安装radis

    一.简介 1.1 关于nosql 介绍Redis之前,先了解下NoSQL (Not noly SQL)不仅仅是SQL, 属于非关系型数据库:Redis就属于非关系型数据库, 传统的Mysql ,ora ...

  5. (一)shiro简介和用户登录demo及角色管理

    一.shiro简介 Apache Shiro是Java的一个安全框架.Shiro可以非常容易的开发出足够好的应用,其不仅可以用在JavaSE环境,也可以用在JavaEE环境.Shiro可以帮助我们完成 ...

  6. JS OOP -02 深入认识JS中的函数

    深入认识JS中的函数: 1.概述,认识函数对象 2.函数对象和其他内部对象的关系 3.将函数作为参数传递 4.传递给函数的隐含参数:arguments 5.函数的apply,call方法和length ...

  7. LeetCode:626.换座位

    题目链接:https://leetcode-cn.com/problems/exchange-seats/ 题目 小美是一所中学的信息科技老师,她有一张 seat 座位表,平时用来储存学生名字和与他们 ...

  8. docker系列之六容器数据卷

    docker之容器数据卷 一.容器数据卷 docker容器运行的时候,会产生一系列的文件,那么我们希望容器产生的数据能提供给其他的容器使用,也就是说怎么实现容器间的数据的共享呢?这就需要用到我们所提到 ...

  9. wangeditor富编辑器在node和vue前后台分离的使用

    本来是想用百度的ueditor编辑器来达到想要的功能的,但在使用中,感觉前后台分离上,需要引入的东西过多,不轻量:然后就去尝试用wangeditor(这个名字听着感觉有点太随意的感觉....但功能上还 ...

  10. $.serializeArray()获取不到input的value值bug问题

    今天修改form表单,发现有好几个input值保存不上,上网搜索了一下是$.serializeArray()获取不到disabled的值.如果想要让input元素变为不可用,可以把input设为rea ...