LOJ2130软件包
题目描述
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软件包的更多相关文章
- 网络原因导致 npm 软件包 node-sass / gulp-sass 安装失败的处理办法
如果你正在构建一个基于 gulp 的前端自动化开发环境,那么极有可能会用到 gulp-sass ,由于网络原因你可能会安装失败,因为安装过程中部分细节会到亚马逊云服务器上获取文件.本文主要讨论在不变更 ...
- 在Ubuntu 16.10安装mysql workbench报未安装软件包 libpng12-0错误
1.安装mysql workbench,提示未安装软件包 libpng12-0 下载了MySQL Workbench 6.3.8 在安装的时候报错: -1ubu1604-amd64.deb 提示: ...
- BZOJ 4196: [Noi2015]软件包管理器 [树链剖分 DFS序]
4196: [Noi2015]软件包管理器 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1352 Solved: 780[Submit][Stat ...
- Fedora 22中的RPM软件包管理工具
Introduction The RPM Package Manager (RPM) is an open packaging system that runs on Fedora as well a ...
- Debian的软件包管理工具命令 (dpkg,apt-get)详解
本文转载于:http://blog.chinaunix.net/uid-20769502-id-106056.html 1.dpkg包管理工具 dpkg --info "软件包名&quo ...
- dpkg:处理软件包dradis (--configure)时出错
dpkg:处理软件包dradis (--configure)时出错!解决方案:1.将info文件夹更名%mv /var/lib/dpkg/info /var/lib/dpkg/info_old2.新建 ...
- [笔记]过期的UBUNTU怎么更新软件包
使用old-releases仓库替换main/security仓库,就像下面这样. sudo sed -i -r 's/([a-z]{2}\.)?archive.ubuntu.com/old-rele ...
- Linux软件包管理
Linux软件包管理 Linux软件包管理主要有2类:是二进制包管理.源码包管理 二进制包管理 主要有RPM和YUM两种 RPM包管理 安装 --ivh:-v ,-vv,-vvv显示的安装信息依次详细 ...
- Ubuntu安装SSH服务器故障分析及解决办法(错误1:E:软件包 openssh-server 还没有可供安装的候选者,错误2:E: 无法修正错误,因为您要求某些软件包保持现状,就是它们破坏了软件包间的依赖关系)
• 微博: 小样儿老师2015 Windows下做Linux开发需要SSH强大功能的支持.安装SSH的过程会出现了很多问题,看完这篇文章可以让你少走些弯路,PS:折腾一下午的成果. Ubuntu ...
随机推荐
- LayUI表单提交不走ajax原因
在使用layui的时候.遇到一个问题.提交表单,没有走ajax,直接提交了表单页面. 原因是因为JQuery未引入 解决办法.引入JQuery或者使用layui自带Jquery var $ = lay ...
- java线程与内核线程的关系,及怎么定义ThreadPoolExecutor相关参数
p.p1 { margin: 0; font: 12px Menlo } p.p1 { margin: 0; font: 12px Menlo } p.p2 { margin: 0; font: 12 ...
- 定期删除文件夹中的文件——C#
下面是自定义的一个函数,参数分别为:文件夹名称.文件后缀.保存天数 逻辑是获取当前系统的时间,和文件创建时间去作差,如果结果大于保存天数,就删除它 /// <summary> /// 定期 ...
- 一个坑,bootstrap selectpicker 重置下拉列表时遇到的问题
需求是这样的:点击右侧三个按钮中的任意一个,如果执行成功,左侧的版本信息就需要重新获取列表.挺简单的需求,但是遇到了一个坑, 在使用$('#id').html('')清空下拉选项并且重新赋值的时候,始 ...
- ATM_tests
ATM取款机练习程序 一.程序分析 自顶向下.逐步细化 按照程序执行的流程,将程序分解为若干个功能相对独立的函数(方法),每个函数(方法)负责某一功能,然后根据程序执行的流程,将函数(方法)组装(调用 ...
- Spring Boot GraphQL 实战 03_分页、全局异常处理和异步加载
hello,大家好,我是小黑,又和大家见面啦~ 今天我们来继续学习 Spring Boot GraphQL 实战,我们使用的框架是 https://github.com/graphql-java-ki ...
- 【Azure Developer】使用Postman获取Azure AD中注册应用程序的授权Token,及为Azure REST API设置Authorization
Azure Active Directory (Azure AD) is Microsoft's cloud-based identity and access management service, ...
- 【MyBatis】MyBatis 缓存
MyBatis 缓存 文章源码 什么是缓存 像大多数的持久化框架一样,MyBatis 也提供了缓存策略,通过缓存策略来减少数据库的查询次数,从而提高性能. Mybatis 中缓存分为一级缓存,二级缓存 ...
- 【剑指 Offer】10-I.斐波那契数列
题目描述 写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项.斐波那契数列的定义如下: F(0) = 0, F(1) = 1 F(N) = F(N - 1) + F(N - ...
- Python绘制雷达图(俗称六芒星)
原文链接:https://blog.csdn.net/Just_youHG/article/details/83904618 背景 <Python数据分析与挖掘实战> 案例2–航空公司客户 ...