【题目链接】

点击打开链接

【算法】

树链剖分,子树的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. 用delphi写多屏幕程序

    http://blog.csdn.net/zyyjc/article/details/6530728 别现在有些POS机是双屏幕的(比如卡西瓦POS机),一个屏幕可以当顾客显示屏用,当闲时也可以显示一 ...

  2. Jetson TK1 二:usb无线网卡的使用

    一.总体是按照群里的文档“TK1连接无线网络”的步骤操作的,但也遇到了一些问题,如下: 1.自动配置设备并下载内核源代码到指定的目录下时(估计是解压时),出现时间超前之类的问题,原因是当前本地时间是几 ...

  3. HSSF生成excel文件损坏

    一开始我的代码是这样的: 然后打开创建的好的excel文件出现下面的问题:,, 这里改下代码就行,其实也不用改,添加下sheet就行,就是一开始是空的,没sheet,所以可能打不开,现在至少要创建一个 ...

  4. Win10激活Office2013的技巧

    原文:http://www.xitongzhijia.net/xtjc/20150720/53252.html KMSpico Win10激活工具 是一款能激活Win8/Win8.1/win10/Of ...

  5. iOS开发 下滑隐藏Tabbar

    项目中用到下滑隐藏tabbar,上滑显示.      虽然实现起来非常简单,还是记录一下. -(void)scrollViewDidScroll:(UIScrollView*)scrollView { ...

  6. C++ 宏定义与常量

    原文: http://blog.csdn.net/t894690230/article/details/50605021 前言:突然想起很久之前上课时被问及C++ 宏定义与常量的区别,仔细了想了想,并 ...

  7. NHibernate之旅(7):初探NHibernate中的并发控制

    本节内容 什么是并发控制? 悲观并发控制(Pessimistic Concurrency) 乐观并发控制(Optimistic Concurrency) NHibernate支持乐观并发控制 实例分析 ...

  8. HDU oj 开门人与关门人

    题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1234 #include<stdio.h> #include<string.h> ...

  9. POJ 3928 Ping pong 树状数组模板题

    開始用瓜神说的方法撸了一发线段树.早上没事闲的看了一下树状数组的方法,于是又写了一发树状数组 树状数组: #include <cstdio> #include <cstring> ...

  10. 卸载 linux http

    当我们想卸载httpd 的时候,使用rpm -qa httpd 的时候,我们发现有很多的依赖包.我们耐心的想一个一个的卸载的时候(使用rpm -e httpd-*),还会进入死循环.解决的办法是:使用 ...