【题目链接】

点击打开链接

【算法】

树链剖分,子树的DFS序也是连续的一段

要注意细节!

【代码】

#include<bits/stdc++.h>
using namespace std;
#define MAXN 100000 struct SegmentTree {
int l,r,sum[],opt;
} tree[MAXN*]; int i,N,Q,x,num;
int depth[MAXN+],size[MAXN+],son[MAXN+],fa[MAXN+],
top[MAXN+],id[MAXN+];
string type;
vector<int> E[MAXN+]; template <typename T> inline void read(T &x) {
int f = ; x = ;
char c = getchar();
for (; !isdigit(c); c = getchar()) { if (c == '-') f = -f; }
for (; isdigit(c); c = getchar()) x = x * + c - '';
x *= f;
} template <typename T> inline void write(T x) {
if (x < ) { putchar('-'); x = -x; }
if (x > ) write(x/);
putchar(x%+'');
} template <typename T> inline void writeln(T x) {
write(x);
puts("");
} inline void dfs1(int x) {
int i,y;
size[x] = ;
for (i = ; i < E[x].size(); i++) {
y = E[x][i];
if (y != fa[x]) {
fa[y] = x;
depth[y] = depth[x] + ;
dfs1(y);
size[x] += size[y];
if ((size[y] > size[son[x]]) || (!son[x])) son[x] = y;
}
}
} inline void dfs2(int x,int tp) {
int i,y;
top[x] = tp; id[x] = ++num;
if (son[x]) dfs2(son[x],tp);
for (i = ; i < E[x].size(); i++) {
y = E[x][i];
if ((y != fa[x]) && (y != son[x]))
dfs2(y,y);
}
} inline void build(int index,int l,int r) {
int mid;
tree[index].l = l; tree[index].r = r;
tree[index].opt = ;
tree[index].sum[] = r - l + ;
if (l == r) return;
mid = (l + r) >> ;
build(index*,l,mid); build(index*+,mid+,r);
} inline void pushdown(int index) {
if (tree[index].l == tree[index].r) return;
tree[index*].opt = tree[index].opt;
tree[index*].sum[tree[index].opt] = tree[index*].r - tree[index*].l + ;
tree[index*].sum[tree[index].opt^] = ;
tree[index*+].opt = tree[index].opt;
tree[index*+].sum[tree[index].opt] = tree[index*+].r - tree[index*+].l + ;
tree[index*+].sum[tree[index].opt^] = ;
} inline void pushup(int index) {
tree[index].sum[] = tree[index*].sum[] + tree[index*+].sum[];
tree[index].sum[] = tree[index*].sum[] + tree[index*+].sum[];
if (tree[index*].opt != tree[index*+].opt) {
tree[index].opt = -;
return;
}
if ((tree[index*].opt == -) || (tree[index*+].opt == -)) {
tree[index].opt = -;
return;
}
tree[index].opt = tree[index*].opt;
} void modify(int index,int l,int r,int val) {
int mid;
if (tree[index].opt != -) pushdown(index);
if ((tree[index].l == l) && (tree[index].r == r)) {
tree[index].sum[val] = r - l + ;
tree[index].sum[val^] = ;
tree[index].opt = val;
} else {
mid = (tree[index].l + tree[index].r) >> ;
if (mid >= r) modify(index*,l,r,val);
else if (mid + <= l) modify(index*+,l,r,val);
else {
modify(index*,l,mid,val);
modify(index*+,mid+,r,val);
}
pushup(index);
}
} inline int query(int index,int l,int r,int val) {
int mid;
if (tree[index].opt != -) pushdown(index);
if ((tree[index].l == l) && (tree[index].r == r)) return tree[index].sum[val];
else {
mid = (tree[index].l + tree[index].r) >> ;
if (mid >= r) return query(index*,l,r,val);
else if (mid + <= l) return query(index*+,l,r,val);
else return query(index*,l,mid,val) + query(index*+,mid+,r,val);
}
} inline int Install(int x) {
int tp = top[x],
ans = ;
while (tp) {
ans += query(,id[tp],id[x],);
modify(,id[tp],id[x],);
x = fa[tp]; tp = top[x];
}
ans += query(,,id[x],);
modify(,,id[x],);
return ans;
} inline int Uninstall(int x) {
int ans = query(,id[x],id[x]+size[x]-,);
modify(,id[x],id[x]+size[x]-,);
return ans;
} int main() { read(N); for (i = ; i < N; i++) {
read(x);
E[x].push_back(i);
} depth[] = ;
dfs1();
dfs2(,); build(,,num); read(Q);
while (Q--) {
cin >> type;
if (type == "install") {
read(x);
writeln(Install(x));
} else {
read(x);
writeln(Uninstall(x));
}
} return ;
}

【NOI 2015】软件包管理器的更多相关文章

  1. [NOI 2015]软件包管理器

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

  2. [bzoj 4196][NOI 2015]软件包管理器

    大概算是一道模板题吧? 就是细节有点多 罗列一下: 如果习惯从1开始搞树的编号的话,处理输入进来的那个依赖关系在加边的时候两个都要+1,体现在代码就是i要从2枚举到n,然后输入进来的那个数要+1 这道 ...

  3. BZOJ4196 软件包管理器

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

  4. 【NOI2015】软件包管理器

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

  5. BZOJ4196 [Noi2015]软件包管理器 【树剖】

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

  6. [bzoj4196][Noi2015]软件包管理器_树链剖分_线段树

    软件包管理器 bzoj-4196 Noi-2015 题目大意:Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件 ...

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

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

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

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

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

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

  10. Chocolatey:Windows软件包管理器

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

随机推荐

  1. MVC模式(三层架构模式)

    (Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图(View)和控制器(Controller). MVC模式最早由Try ...

  2. ueditor整合之后前段不显示高亮

    自己整合ueditor插件后,发现在前段显示的时候并没有高亮处理 在网上看了一些方法后,自己尝试了下. 1.在页面上引入相关的js和css文件 主要是以下两个文件 <script src=&qu ...

  3. Linux下使用Shell命令控制任务Jobs执行(转)

    一.下列命令可以用来操纵进程任务: ps列出系统中正在运行的进程. kill发送信号给一个或多个进程(经常用来杀死一个进程). jobs列出当前shell环境中已启动的任务状态,若未指定jobsid, ...

  4. Android安全机制介绍

    Android的安全机制包含下面几个方面:      • 进程沙箱隔离机制.      • 应用程序签名机制.      • 权限声明机制.      • 訪问控制机制.      • 进程通信机制. ...

  5. Android四大组件的生命周期

    介绍生命周期之前,先提一下任务的概念 任务其实就是activity 的栈它由一个或多个Activity组成的共同完成一个完整的用户体验, 换句话说任务就是” 应用程序” (可以是一个也可以是多个,比如 ...

  6. Linux bridge-utils tunctl 使用

    网络 brctl是Linux下用来管理以太网桥.在内核中建立.维护.检查网桥配置的命令 STP - Spanning Tree Protocol(生成树协议)逻辑上断开环路.防止二层网络的广播风暴的产 ...

  7. hive:Access denied for user &#39;root&#39;@&#39;%&#39;

    配置hive全分布模式时候,在mysql里面创建用户:create user 'hive' identified by 'hive'; 然后给hive帐号分配全部权限: grant all privi ...

  8. 获取DOM父元素和子元素

    利用javascript可以遍历DOM树,这篇文章介绍用获取一个DOM元素的所有父节点和获取一个DOM元素的所以子孙节点. 1.获取所有父节点.用递归的方法,用parentNode属性. <!D ...

  9. npm 的常用操作

    cd 项目目录 npm install -y 初始化信息,-y表示所有的选择都表示确定 执行完之后会自动生成一个package.json文件 添加依赖: npm -i(install) jquery ...

  10. 阿里云安装nginx 启动失败的原因。

    阿里云编译安装nginx服务器后启动一直报下面错误. 百度了一圈,看到一个说要先关掉apache服务,感觉这个好像是对的,立马做了下面操作. 果然把nginx起了起来. 从这边才知道apache和ng ...