题目描述
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. Let’s Encrypt 通配符证书,泛域名证书申请配置

    首先你可以查看下官方提供的支持申请通配符证书的客户端列表:https://letsencrypt.org/docs/client-options/. 参考链接:https://github.com/N ...

  2. Head First 设计模式 —— 08. 外观 (Facade) 模式

    思考题 想想看,你在 JavaAPI 中遇到过哪些外观,你还希望 Java 能够新增哪些外观? P262 println.log 日志接口.JDBC 接口 突然让想感觉想不出来,各种 API 都用得挺 ...

  3. 离散傅里叶变换DFT入门

    网上对于傅里叶变换相关的文章很多(足够多),有的是从物理相关角度入场,有的从数学分析角度入场.对于有志学习相关概念的同学还是能够很好的理解的. 数学包括三大块:代数学.几何.数学分析.前两块我们在中学 ...

  4. js 判断用户是手机端还是电脑端访问

    通过userAgent 判断,网页可以直接使用 navigation对象 node端 可以通过请求头的 ctx.request.header['user-agent'] const browser = ...

  5. Flutter 布局类组件:简介

    前言 布局类组件都会包含一个或多个子组件,不同的布局类组件对子组件排版(layout)方式不同. 我们知道,Element树才是最终的绘制树,Element树是通过Widget树来创建的(通过Widg ...

  6. C语言实现蛇形矩阵

    今天大一考试C语言的时候看见了这道题,下面是我转载的一个大佬的博客,自认为分析的很清楚,特来分享一下. **原文地址: https://blog.csdn.net/jack22333/article/ ...

  7. Openstack Nova 添加计算节点(六.一)

    Openstack Nova 添加计算节点(六.一) # 重要的两点: 1 时间同步 2 yum 源 # 安装软件: yum install openstack-selinux openstack-n ...

  8. Java基础学习总结笔记

    Java基础 Java常用内存区域 栈内存空间:存储引用堆内存空间的地址 堆内存空间:保存每个对象的具体属性内容 全局数据区:保存static类型的属性 全局代码区:保存所有的方法定义 修饰符 权限修 ...

  9. JavaScript中的原型、原型链、原型模式

    今天,咱来聊聊JavaScript中的原型跟原型链 原型跟原型模式 这一块的知识,主要是设计模式方面的. 首先,我们知道JavaScript是面向对象的.既然是面向对象,那它自然也有相应的类跟对象等概 ...

  10. 18.java设计模式之中介者模式

    基本需求 智能家庭包括各种设备,闹钟.咖啡机.电视机.窗帘等 要看电视时,各个设备可以协同工作,自动完成看电视的准备工作,比如流程为:闹铃响起->咖啡机开始做咖啡->窗帘自动落下-> ...