你決定設計你自己的軟體包管理器。不可避免的,你要解決軟體包之間的依賴關係。如果a依賴b,那麼安裝a之前需安裝b,解除安裝b之前須解除安裝a。0號軟體包不依賴任何軟體包。依賴關係不存在環(包括自環)。
你的任務是,求出每次安裝、刪除操作會改變多少個包的狀態。
安裝乙個已安裝的軟體包,或者解除安裝乙個未安裝的軟體包,都不會改變任何軟體包的安裝狀態,即在此情況下,改變安裝狀態的軟體包數為0
每次操作不僅需要計算安裝軟體包數,還作為操作影響後來的安裝/刪除
第一行乙個整數n,表示軟體包的總數。
隨後n-1個整數a1
,a2,
...a
n−1 ,表示第i個軟體包依賴第ai
個軟體包
接下來一行乙個整數q,表示詢問數
之後q行,每行乙個詢問,詢問分為兩種in
stal
l x:
表示安裝
x u
nins
tall
x:表示解除安裝x
q行,每行乙個整數,為第i步操作改變安裝狀態的軟體包數
【樣例輸入1】
0 0 0 1 1 5
install 5
install 6
uninstall 1
install 4
uninstall 0
【樣例輸出1】
【樣例說明1】:
一開始所有的軟體包都處於未安裝狀態。
安裝5號軟體包,需安裝0,1,5三個軟體包
之後安裝6號軟體包,只需安裝6號軟體包。此時安裝了0,1,5,6四個軟體包。
解除安裝1號軟體包需要解除安裝1,5,6三個軟體包,此時只有0號軟體包還處於安裝狀態
之後安裝4號軟體包,需安裝1,4兩個軟體包。此時0,1,4處於安裝狀態
最後,解除安裝0號軟體包會解除安裝所有的軟體包
【樣例輸入2】
0 1 2 1 3 0 0 3 2
install 0
install 3
uninstall 2
install 7
install 5
install 9
uninstall 9
install 4
install 1
install 9
【樣例輸出2】
1,2:n=5000 q=5000
3,4:n=100000 q=100000 沒有解除安裝操作
5,6,7,8 n=100000,q=100000 依賴關係和操作隨機
9-20 n=100000,q=100000 不隨機
noi2015day1t2
對於題面的描述的,我們很容易想到它是棵樹,並且節點又是1e+5,我們選擇用樹剖+線段樹;
我們維護線段樹上每乙個點的狀態(安裝或未安裝,安裝用1來表示,未安裝用-1來表示)和當前節點已被覆蓋的點數,未被覆蓋的點數可以也維護,也可以用區間長減去已被覆蓋節點數,當乙個線段樹節點被打上安裝或未安裝標記時,就將答案加上已被覆蓋的點數或未被覆蓋點數並更新其值(乙個為0,另乙個為區間長),在拿它來更新父親節點
所維護的資訊,最後輸出答案就行。。
**如下:
#include
#include
#include
#include
#include
using
namespace
std;
const
intmax
=100000+10
;intfa[
max];
intdep
[max
];int
son[
max]=;
inttop
[max
];int
size
[max
];int
tid[
max];
inthead
[max
]=;intto[
max<<1];
intnext
[max
<<
1]=;
intedge=1
,tim=0
;intn;
inline
void
dfs1
(intx,
intp
,intd)
}}inline
void
dfs2
(intx,
intp)}
#define
isnum (c
>=
'0'&&
c<=
'9')
inline
void
read
(int&x
)}inline
void
addedge
(intx,
inty
)int
isum
[max
<<
2]=,
usum
[max
<<2];
intins
[max
<<
2]=;
intans
;intl,
r;#define
lson o
<<1,
l,mid#define
rson o
<<1|
1,mid+1,
rinline
void
pushup
(into)
inline
void
pushdown
(into,
intl
,intr)
else
}inline
void
build
(into,
intl
,intr)
intmid=(l
+r)>>1;
build
(lson
);build
(rson
);pushup(o
);}inline
void
query1
(into,
intl
,intr)
elseif(
l!=r)
}inline
void
query2
(into,
intl
,intr)
elseif(
l!=r)
}inline
void
query1
(intx,
inty)if
(dep[x
]>
dep[y])
swap(x
,y);l
=tid[x
],r=tid[y
];query1(1
,1,n
);}inline
void
query2
(intx)
intmain
()intm;
read(m
);dfs1(1
,1,1
);dfs2(1
,1);build(1
,1,n
);string s
;for
(inti=
1;i<=m;
i++)
else
}return0;
}
Noi2015 軟體包管理器
time limit 10 sec memory limit 512 mb 你決定設計你自己的軟體包管理器。不可避免地,你要解決軟體包之間的依賴問題。如果軟體包a依賴軟體包b,那麼安裝軟體包a以前,必須先安裝軟體包b。同時,如果想要解除安裝軟體包b,則必須解除安裝軟體包a。現在你已經獲得了所有的軟體...
NOI2015 軟體包管理器
樹鏈剖分維護。1表示安裝的狀態,0表示沒有安裝的狀態。如果install就是把當前點到根的所有點都變成1,然後計算前後的 delta 如果uninstall呢,就是把自己的子樹變成0,答案也是前後的 delta 具體可以參照 不過我的 常數好大啊,跑得好慢。如下 include include in...
NOI 2015 軟體包管理器
問題描述 你決定設計你自己的軟體包管理器。不可避免地,你要解決軟體包之間的依賴問題。如果軟體包 a 依賴軟體包 b 那麼安裝軟體包 a 以前,必須先安裝軟體包 b 同時,如果想要解除安裝軟體包 b 則必須解除安裝軟體包 a 現在你已經獲得了所有的軟體包之間的依賴關係。而且,由於你之前的工作,除 0 ...