【题目链接】

点击打开链接

【算法】

树链剖分,子树的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. HDU 4341 Gold miner(分组背包)

    题目链接 Gold miner 目标是要在规定时间内获得的价值总和要尽可能大. 我们先用并查集把斜率相同的物品分在同一个组. 这些组里的物品按照y坐标的大小升序排序. 如果组内的一个物品被选取了,那该 ...

  2. 用systemtap跟踪打印动态链接库的所有c++函数调用过程

    http://gmd20.blog.163.com/blog/static/168439232015475525227/             用systemtap跟踪打印动态链接库的所有c++函数 ...

  3. 【CV知识学习】神经网络梯度与归一化问题总结+highway network、ResNet的思考

    这是一篇水货写的笔记,希望路过的大牛可以指出其中的错误,带蒟蒻飞啊~ 一.    梯度消失/梯度爆炸的问题 首先来说说梯度消失问题产生的原因吧,虽然是已经被各大牛说烂的东西.不如先看一个简单的网络结构 ...

  4. [原创]安装Ubuntu Server 14.04后

    安装后许多软件都没有,需要进行安装. 官方指南:https://help.ubuntu.com/lts/serverguide/index.html 1.修改网络配置文件 用ifconfig查看本地网 ...

  5. hadoop-mapreduce中reducetask执行分析

    ReduceTask的执行 Reduce处理程序中须要运行三个类型的处理, 1.copy,从各map中copy数据过来 2.sort,对数据进行排序操作. 3.reduce,运行业务逻辑的处理. Re ...

  6. Solidworks如何绘制装饰螺纹线

    1 插入-注解,装饰螺纹线   2 绘制装饰螺纹线,选择螺纹的边线,标准选择ISO,下面可以选择的范围就确定了(M6的孔,只能选择M8的螺纹或者M10的螺纹),画好之后在3D图中并没有明确的螺纹样式 ...

  7. Androidclient验证Licence的原理

    需求 限制App的使用,使App仅仅能在有许可的设备上执行. 分析及解决方式 原理 让App在每次执行的时候都连接server进行合法性验证--当然是一个非常成熟可靠的方案. 可是这样做的局限也是每次 ...

  8. 安装Sublime配合quick-cocos2d-x开发

    下载地址 Sublime下载地址 安装 Package Control 在Sublime中,按Ctrl+~打开控制台,输入: Sublime Text2 import urllib2,os; pf=' ...

  9. Linux上Libevent的安装

    1.下载wget -O libevent-2.0.21-stable.tar.gz https://github.com/downloads/libevent/libevent/libevent-2. ...

  10. 性能问题案例02——sybase连接堵塞问题

    现象:近期现场反馈一个问题.系统在审批的时候,常常卡死.整个系统全然用不了,浏览器訪问处于loading的状态. 排查: 1.一般系统挂了首先想到内存问题,可是现象是loading,也就是说没有挂,线 ...