題目 2468:
信息學(xué)奧賽一本通T1562-軟件包管理器
時間限制: 2s
內(nèi)存限制: 192MB 提交: 6 解決: 3
題目描述
Linux 用戶和 OSX 用戶一定對軟件包管理器不會陌生。通過軟件包管理器,你可以通過一行命令安裝某一個軟件包,然后軟件包管理器會幫助你從軟件源下載軟件包,同時自動解決所有的依賴(即下載安裝這個軟件包的安裝所依賴的其它軟件包),完成所有的配置。Debian/Ubuntu 使用的 apt-get,F(xiàn)edora/CentOS 使用的 yum,以及 OSX 下可用的 Homebrew 都是優(yōu)秀的軟件包管理器。
你決定設(shè)計你自己的軟件包管理器。不可避免地,你要解決軟件包之間的依賴問題。如果軟件包 A 依賴軟件包 B,那么安裝軟件包 A 以前,必須先安裝軟件包 B。同時,如果想要卸載軟件包 B,則必須卸載軟件包 A?,F(xiàn)在你已經(jīng)獲得了所有的軟件包之間的依賴關(guān)系。而且,由于你之前的工作,除 0 號軟件包以外,在你的管理器當(dāng)中的軟件包都會依賴一個且僅一個軟件包,而 0 號軟件包不依賴任何一個軟件包。依賴關(guān)系不存在環(huán)(若有m(m≥2) 個軟件包A1 ,A2 ,A3 ,…,Am ,其中 A1 依賴 A2 ,A2 依賴 A3 依賴 A4 ,……,Am?1 依賴 Am ,而 Am 依賴 A1 ,則稱這 m 個軟件包的依賴關(guān)系構(gòu)成環(huán)),當(dāng)然也不會有一個軟件包依賴自己。
現(xiàn)在你要為你的軟件包管理器寫一個依賴解決程序。根據(jù)反饋,用戶希望在安裝和卸載某個軟件包時,快速地知道這個操作實際上會改變多少個軟件包的安裝狀態(tài)(即安裝操作會安裝多少個未安裝的軟件包,或卸載操作會卸載多少個已安裝的軟件包),你的任務(wù)就是實現(xiàn)這個部分。注意,安裝一個已安裝的軟件包,或卸載一個未安裝的軟件包,都不會改變?nèi)魏诬浖陌惭b狀態(tài),即在此情況下,改變安裝狀態(tài)的軟件包數(shù)為 0。
輸入格式
輸入的第 1 行包含 1 個正整數(shù) n,表示軟件包的總數(shù)。軟件包從 0 開始編號。
隨后一行包含 n?1 個整數(shù),相鄰整數(shù)之間用單個空格隔開,分別表示 1,2,3,…,n?2,n?1 號軟件包依賴的軟件包的編號。
接下來一行包含一個正整數(shù) q,表示詢問的總數(shù)。
之后 q 行,每行一個詢問。詢問分為兩種:
installx:表示安裝軟件包 x
uninstallx:表示卸載軟件包 x
你需要維護每個軟件包的安裝狀態(tài),一開始所有的軟件包都處于未安裝狀態(tài)。對于每個操作,你需要輸出這步操作會改變多少個軟件包的安裝狀態(tài),隨后應(yīng)用這個操作(即改變你維護的安裝狀態(tài))。
輸出格式
輸出包括 q 行。 輸出文件的第 i 行輸出一個整數(shù),為第 i 步操作中改變安裝狀態(tài)的軟件包數(shù)。
樣例輸入 復(fù)制
7
0 0 0 1 1 5
5
install 5
install 6
uninstall 1
install 4
uninstall 0
提示
樣例解釋:
一開始所有的軟件包都處于未安裝狀態(tài)。
安裝 5 號軟件包,需要安裝 0,1,5 三個軟件包。
之后安裝 6 號軟件包,只需要安裝 6 號軟件包。此時安裝了 0,1,5,6 四個軟件包。
卸載 1 號軟件包需要卸載 1,5,6 三個軟件包。此時只有 0 號軟件包還處于安裝狀態(tài)。
之后安裝 4 號軟件包,需要安裝 1,4 兩個軟件包。此時 0,1,4 處在安裝狀態(tài)。
最后,卸載 0 號軟件包會卸載所有的軟件包。
數(shù)據(jù)范圍與提示:
對于所有數(shù)據(jù),n≤100000,q≤100000。
C
C++
Java
Python
PHP
代碼重置
開啟O2優(yōu)化