软件包管理器(树链剖分)
生活随笔
收集整理的這篇文章主要介紹了
软件包管理器(树链剖分)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
Linux用戶和OSX用戶一定對(duì)軟件包管理器不會(huì)陌生。通過(guò)軟件包管理器,你可以通過(guò)一行命令安裝某一個(gè)軟件包,然后軟件包管理器會(huì)幫助你從軟件源下載軟件包,同時(shí)自動(dòng)解決所有的依賴(即下載安裝這個(gè)軟件包的安裝所依賴的其它軟件包),完成所有的配置。Debian/Ubuntu使用的apt-get,Fedora/CentOS使用的yum,以及OSX下可用的homebrew都是優(yōu)秀的軟件包管理器。
你決定設(shè)計(jì)你自己的軟件包管理器。不可避免地,你要解決軟件包之間的依賴問(wèn)題。如果軟件包A依賴軟件包B,那么安裝軟件包A以前,必須先安裝軟件包B。同時(shí),如果想要卸載軟件包B,則必須卸載軟件包A。現(xiàn)在你已經(jīng)獲得了所有的軟件包之間的依賴關(guān)系。而且,由于你之前的工作,除0號(hào)軟件包以外,在你的管理器當(dāng)中的軟件包都會(huì)依賴一個(gè)且僅一個(gè)軟件包,而0號(hào)軟件包不依賴任何一個(gè)軟件包。依賴關(guān)系不存在環(huán)(若有m(m≥2)個(gè)軟件包A1,A2,A3,…,Am,其中A1依賴A2,A2依賴A3,A3依賴A4,……,Am?1依賴Am,而Am依賴A1,則稱這m個(gè)軟件包的依賴關(guān)系構(gòu)成環(huán)),當(dāng)然也不會(huì)有一個(gè)軟件包依賴自己。
現(xiàn)在你要為你的軟件包管理器寫(xiě)一個(gè)依賴解決程序。根據(jù)反饋,用戶希望在安裝和卸載某個(gè)軟件包時(shí),快速地知道這個(gè)操作實(shí)際上會(huì)改變多少個(gè)軟件包的安裝狀態(tài)(即安裝操作會(huì)安裝多少個(gè)未安裝的軟件包,或卸載操作會(huì)卸載多少個(gè)已安裝的軟件包),你的任務(wù)就是實(shí)現(xiàn)這個(gè)部分。注意,安裝一個(gè)已安裝的軟件包,或卸載一個(gè)未安裝的軟件包,都不會(huì)改變?nèi)魏诬浖陌惭b狀態(tài),即在此情況下,改變安裝狀態(tài)的軟件包數(shù)為0。
Input
輸入文件的第1行包含1個(gè)正整數(shù)n,表示軟件包的總數(shù)。軟件包從0開(kāi)始編號(hào)。 隨后一行包含n?1個(gè)整數(shù),相鄰整數(shù)之間用單個(gè)空格隔開(kāi),分別表示1,2,3,…,n?2,n?1號(hào)軟件包依賴的軟件包的編號(hào)。 接下來(lái)一行包含1個(gè)正整數(shù)q,表示詢問(wèn)的總數(shù)。 之后q行,每行1個(gè)詢問(wèn)。詢問(wèn)分為兩種: installx:表示安裝軟件包x uninstallx:表示卸載軟件包x 你需要維護(hù)每個(gè)軟件包的安裝狀態(tài),一開(kāi)始所有的軟件包都處于未安裝狀態(tài)。對(duì)于每個(gè)操作,你需要輸出這步操作會(huì)改變多少個(gè)軟件包的安裝狀態(tài),隨后應(yīng)用這個(gè)操作(即改變你維護(hù)的安裝狀態(tài))。Output
輸出文件包括q行。 輸出文件的第i行輸出1個(gè)整數(shù),為第i步操作中改變安裝狀態(tài)的軟件包數(shù)。Sample Input
7
0 0 0 1 1 5
5
install 5
install 6
uninstall 1
install 4
uninstall 0
Sample Output
3
1
3
2
3
Hint
樹(shù)鏈剖分第二題,加油。
努力加油a啊
總結(jié)
以上是生活随笔為你收集整理的软件包管理器(树链剖分)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 洛谷3384(树链剖分模板题)
- 下一篇: bzoj3252攻略(线段树+dfs序)