题目描述
Linux用户和OSX用户一定对软件包管理器不会陌生。通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件源下载软件包,同时自动解决所有的依赖(即下载安装这个软件包的安装所依赖的其它软件包),完成所有的配置。Debian/Ubuntu使用的apt-get,Fedora/CentOS使用的yum,以及OSX下可用的Homebrew都是优秀的软件包管理器。

你决定设计你自己的软件包管理器。不可避免地,你要解决软件包之间的依赖问题。如果软件包A依赖软件包B,那么安装软件包A以前,必须先安装软件包B。同时,如果想要卸载软件包B,则必须卸载软件包A。现在你已经获得了所有的软件包之间的依赖关系。而且,由于你之前的工作,除0号软件包以外,在你的管理器当中的软件包都会依赖一个且仅一个软件包,而0号软件包不依赖任何一个软件包。依赖关系不存在环(若有m(m≥2)个软件包A1,A2,A3,…,Am,其中A1依赖A2,​A2依赖A3,A3依赖A4,……,Am−1依赖Am,而Am依赖A1,则称这m个软件包的依赖关系构成环),当然也不会有一个软件包依赖自己。

现在你要为你的软件包管理器写一个依赖解决程序。根据反馈,用户希望在安装和卸载某个软件包时,快速地知道这个操作实际上会改变多少个软件包的安装状态(即安装操作会安装多少个未安装的软件包,或卸载操作会卸载多少个已安装的软件包),你的任务就是实现这个部分。注意,安装一个已安装的软件包,或卸载一个未安装的软件包,都不会改变任何软件包的安装状态,即在此情况下,改变安装状态的软件包数为00。

输入格式
输入文件的第1行包含1个正整数n,表示软件包的总数。软件包从0开始编号。
随后一行包含n-1个整数,相邻整数之间用单个空格隔开,分别表示1,2,3,…,n−2,n−1号软件包依赖的软件包的编号。
接下来一行包含一个正整数q,表示询问的总数。
之后q行,每行一个询问。询问分为两种:
install x:表示安装软件包x
uninstall x:表示卸载软件包x

你需要维护每个软件包的安装状态,一开始所有的软件包都处于未安装状态。对于每个操作,你需要输出这步操作会改变多少个软件包的安装状态,随后应用这个操作(即改变你维护的安装状态)。

输出格式
输出文件包括q行。输出文件的第i行输出一个整数,为第i步操作中改变安装状态的软件包数。

样例
样例输入
7
0 0 0 1 1 5
5
install 5
install 6
uninstall 1
install 4
uninstall 0
样例输出
3
1
3
2
3
样例解释
一开始所有的软件包都处于未安装状态。

安装5号软件包,需要安装0,1,5三个软件包。

之后安装6号软件包,只需要安装6号软件包。此时安装了0,1,5,6四个软件包。

卸载1号软件包需要卸载1,5,6三个软件包。此时只有0号软件包还处于安装状态。

之后安装4号软件包,需要安装1,4两个软件包。此时0,1,4处在安装状态。

最后,卸载0号软件包会卸载所有的软件包。

数据范围与提示
对于所有数据,n≤100000,q≤100000。

——————————————————————————————————————————————————

树链剖分,知识点与上一题一样,DFS序。

——————————————————————————————————————————————————

  1 #include<bits/stdc++.h>
2 using namespace std;
3 typedef long long ll;
4 const ll maxn=1e5+10;
5 ll n,m;
6 struct edge
7 {
8 int u,v,nxt;
9 }e[maxn];
10 ll head[maxn],js;
11 void addage(ll u,ll v)
12 {
13 e[++js].u=u;e[js].v=v;
14 e[js].nxt=head[u];head[u]=js;
15 }
16 ll dep[maxn],siz[maxn],fat[maxn],son[maxn];
17 void dfs(ll u,ll fa)
18 {
19 dep[u]=dep[fa]+1;
20 fat[u]=fa;
21 siz[u]=1;
22 for(ll i=head[u];i;i=e[i].nxt)
23 {
24 ll v=e[i].v;
25 if(v==fa)continue;
26 dfs(v,u);
27 siz[u]+=siz[v];
28 if(!son[u] || siz[son[u]]<siz[v])son[u]=v;
29 }
30 }
31 ll top[maxn],lp[maxn],rp[maxn],fos[maxn],p;
32 void getpos(ll u,ll fa)
33 {
34 top[u]=fa;
35 lp[u]=++p;
36 fos[p]=u;
37 if(!son[u])
38 {
39 rp[u]=p;
40 return ;
41 }
42 getpos(son[u],fa);
43 for(ll i=head[u];i;i=e[i].nxt)
44 {
45 ll v=e[i].v;
46 if(v!=fat[u] && v!=son[u])getpos(v,v);
47 }
48 rp[u]=p;
49 }
50 ll _sum[maxn<<2],_delt[maxn<<2];
51 void down(ll cur,ll l,ll r)
52 {
53 ll mid=(l+r)>>1;
54 _delt[cur<<1]=_delt[cur<<1|1]=_delt[cur];
55 _sum[cur<<1]=_delt[cur]*(mid-l+1);
56 _sum[cur<<1|1]=_delt[cur]*(r-mid);
57 }
58 void update(ll cur)
59 {
60 _sum[cur]=_sum[cur<<1]+_sum[cur<<1|1];
61 if(_delt[cur<<1]==0 && _delt[cur<<1|1]==0)_delt[cur]=0;
62 else if(_delt[cur<<1]==1 && _delt[cur<<1|1]==1)_delt[cur]=1;
63 else _delt[cur]=2;
64 }
65 ll set1(ll cur,ll l,ll r,ll ql,ll qr)
66 {
67 ll ans=0;
68 if(ql<=l && r<=qr)
69 {
70 ans=r-l+1-_sum[cur];
71 _sum[cur]=r-l+1;
72 _delt[cur]=1;
73 return ans;
74 }
75 ll mid=(l+r)>>1;
76 if(_delt[cur]!=2)down(cur,l,r);
77 if(ql<=mid)ans+=set1(cur<<1,l,mid,ql,qr);
78 if(mid<qr)ans+=set1(cur<<1|1,mid+1,r,ql,qr);
79 update(cur);
80 return ans;
81 }
82 ll install(ll x)
83 {
84 ll ans=0;
85 while(x)
86 {
87 ll tpx=top[x];
88 ans+=set1(1,1,n,lp[tpx],lp[x]);
89 x=fat[tpx];tpx=top[x];
90 }
91 return ans;
92 }
93 ll set0(ll cur,ll l,ll r,ll ql,ll qr)
94 {
95 ll ans=0;
96 if(ql<=l && r<=qr)
97 {
98 ans+=_sum[cur];
99 _delt[cur]=0;
100 _sum[cur]=0;
101 return ans;
102 }
103 ll mid=(l+r)>>1;
104 if(_delt[cur]!=2)down(cur,l,r);
105 if(ql<=mid)ans+=set0(cur<<1,l,mid,ql,qr);
106 if(mid<qr)ans+=set0(cur<<1|1,mid+1,r,ql,qr);
107 update(cur);
108 return ans;
109 }
110 int main()
111 {
112 scanf("%lld",&n);
113 for(ll u,i=2;i<=n;++i)
114 {
115 scanf("%lld",&u);
116 addage(u+1,i);
117 }
118 dfs(1,0);
119 getpos(1,1);
120 scanf("%lld",&m);
121 char s[15];
122 ll x;
123 while(m--)
124 {
125 scanf("%s%lld",s,&x);
126 if(s[0]=='i')
127 {
128 printf("%lld\n",install(x+1));
129 }
130 else
131 {
132 printf("%lld\n",set0(1,1,n,lp[x+1],rp[x+1]));
133 }
134 }
135 return 0;
136 }

LOJ2130软件包的更多相关文章

  1. 网络原因导致 npm 软件包 node-sass / gulp-sass 安装失败的处理办法

    如果你正在构建一个基于 gulp 的前端自动化开发环境,那么极有可能会用到 gulp-sass ,由于网络原因你可能会安装失败,因为安装过程中部分细节会到亚马逊云服务器上获取文件.本文主要讨论在不变更 ...

  2. 在Ubuntu 16.10安装mysql workbench报未安装软件包 libpng12-0错误

    1.安装mysql workbench,提示未安装软件包 libpng12-0 下载了MySQL Workbench 6.3.8   在安装的时候报错: -1ubu1604-amd64.deb 提示: ...

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

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

  4. Fedora 22中的RPM软件包管理工具

    Introduction The RPM Package Manager (RPM) is an open packaging system that runs on Fedora as well a ...

  5. Debian的软件包管理工具命令 (dpkg,apt-get)详解

    本文转载于:http://blog.chinaunix.net/uid-20769502-id-106056.html   1.dpkg包管理工具 dpkg --info "软件包名&quo ...

  6. dpkg:处理软件包dradis (--configure)时出错

    dpkg:处理软件包dradis (--configure)时出错!解决方案:1.将info文件夹更名%mv /var/lib/dpkg/info /var/lib/dpkg/info_old2.新建 ...

  7. [笔记]过期的UBUNTU怎么更新软件包

    使用old-releases仓库替换main/security仓库,就像下面这样. sudo sed -i -r 's/([a-z]{2}\.)?archive.ubuntu.com/old-rele ...

  8. Linux软件包管理

    Linux软件包管理 Linux软件包管理主要有2类:是二进制包管理.源码包管理 二进制包管理 主要有RPM和YUM两种 RPM包管理 安装 --ivh:-v ,-vv,-vvv显示的安装信息依次详细 ...

  9. Ubuntu安装SSH服务器故障分析及解决办法(错误1:E:软件包 openssh-server 还没有可供安装的候选者,错误2:E: 无法修正错误,因为您要求某些软件包保持现状,就是它们破坏了软件包间的依赖关系)

    •    微博: 小样儿老师2015 Windows下做Linux开发需要SSH强大功能的支持.安装SSH的过程会出现了很多问题,看完这篇文章可以让你少走些弯路,PS:折腾一下午的成果. Ubuntu ...

随机推荐

  1. Redis基础篇(五)AOF与RDB比较和选择策略

    RDB和AOF对比 关于RDB和AOF的优缺点,官网上面也给了比较详细的说明redis.io/topics/pers- RDB 优点: RDB快照是一个压缩过的非常紧凑的文件,保存着某个时间点的数据集 ...

  2. leetcode 274H-index

    public int hIndex(int[] citations) { /* 唠唠叨叨说了很多 其实找到一个数h,使得数组中至少有h个数大于等于这个数, 其他N-h个数小于这个数,h可能有多个,求最 ...

  3. linkedhashmap中关于LRU算法的实现

    //LinkedHashMap的一个构造函数,当参数accessOrder为true时,即会按照访问顺序排序,最近访问的放在最前,最早访问的放在后面 public LinkedHashMap(int ...

  4. Scaled-YOLOv4 快速开始,训练自定义数据集

    代码: https://github.com/ikuokuo/start-scaled-yolov4 Scaled-YOLOv4 代码: https://github.com/WongKinYiu/S ...

  5. B树与B+树区别辨析

    我们都知道,innodb中的索引结构使用的是B+树.B+树是一种B树的变形树,而B树又是来源于平衡二叉树.相较于平衡二叉树,B树更适合磁盘场景下文件索引系统.那为什么B树更适合磁盘场景,B+树又在B树 ...

  6. NOIP初赛篇——04计算机软件系统

    计算机软件是指计算机系统中的程序及其文档,也是用户与硬件之间的接口,用户主要通过软件与计算机进行交流,软件是计算机的灵魂.没有安装软件的计算机称为"裸机",无法完成任何工作.一般软 ...

  7. ssh信任 sftp用法 scp用法【转】

    为了进行批量关机工作,前提要配置好ssh的双机信任. A机192.168.1.241 B机192.168.1.212 在A机上获取一个pub密钥,即为公共密钥. 执行这个命令后:ssh-keygen  ...

  8. Mac M1原生(ARM64)Golang dev&debug

    前言 通过本文最终实现了在M1芯片的Mac mini上的Goland的开发,并通过编译源码解决了无法DEBUG的问题. Go 1.16版将正式支持Apple Silicon M1芯片,即arm64架构 ...

  9. 通过写n本书的积累,我似乎找到了写好技术文章的方法(回复送我写的python股票电子书)

    我写的书不算少,写的博文就更多了,但大多数书的销量也就一般,而我写的技术文章里,虽然也有点击过万的,但不少点击量也就只有三位数. 通过不断反思,也通过对比了一些畅销书和顶流文章,我似乎找到了一些原因, ...

  10. webpack知识点整理

    作用域 es6里模块化的写法 会存在的问题,变量.方法名字雷同,外部文件调用的时候出现问题 如 a.js里 var a='susan' b.js里 var a='jack' 问题解决方案,添加包裹 a ...