noi2015軟體包管理器

2021-07-22 23:34:08 字數 3836 閱讀 7119

你決定設計你自己的軟體包管理器。不可避免的,你要解決軟體包之間的依賴關係。如果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 ...