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 ...
随机推荐
- select * from 多张表的用法
select * from 多张表的用法 其实就是 inner join select * from Class c,Student s where c.ClassID=s.ClassID ...
- 嵌入式Linux-Bmp转jpeg
代码: /**************************************************************************** Ãû³Æ£º jpeg.c ¹ŠÄÜ ...
- 如何在K8S中优雅的使用私有镜像库 (Docker版)
前言 在企业落地 K8S 的过程中,私有镜像库 (专用镜像库) 必不可少,特别是在 Docker Hub 开始对免费用户限流之后, 越发的体现了搭建私有镜像库的重要性. 私有镜像库不但可以加速镜像的拉 ...
- Spring Cloud Eureka 简单创建
1.pom.xml 添加相关依赖 <dependency> <groupId>org.springframework.cloud</groupId> ...
- java零基础之---eclipse的使用
想写一篇关于初学者如何使用工具的博客,作为初学者使用IDE的第一个工具,深受大家喜欢,先写一篇eclipse的,然后再逐步推出idea, vscode 等 1. eclipse的下载及安装 1)百度搜 ...
- 使用ThreadLocal
使用ThreadLocal 阅读: 135212 多线程是Java实现多任务的基础,Thread对象代表一个线程,我们可以在代码中调用Thread.currentThread()获取当前线程.例如,打 ...
- 第三章 IP地址规划设计技术(很重要)
知识重点: 选择题考点 IP基础(网络地址.子网掩码) 网络地址转换 NAT 的原理 CIDR (计算方法) IPv6 地址表示 综合题 IP地址的分类与计算 VLSM 地址规划 3.1 基础知识 3 ...
- 2021升级版微服务教程—为什么会有微服务?什么是SpringCloud?
2021升级版SpringCloud教程从入门到实战精通「H版&alibaba&链路追踪&日志&事务&锁」 教程全目录「含视频」:https://gitee.c ...
- 杭电OJ2010---水仙花数(c++)(方法:输出几个数之间用空格隔开,最后一个数没有空格)
水仙花数 Problem Description 春天是鲜花的季节,水仙花就是其中最迷人的代表,数学上有个水仙花数,他是这样定义的: "水仙花数"是指一个三位数,它的各位数字的立方 ...
- 打算写一些Netty的文章了,先聊聊为什么要学习Netty
微信搜索[阿丸笔记],关注Java/MySQL/中间件各系列原创实战笔记,干货满满. 2021年了,终于开始系统性总结Netty相关的东西了. 这会是Netty系列的第一篇,我想先聊聊 "为 ...