洛谷 P2146 NOI2015 軟體包管理器

2022-04-06 21:44:42 字數 2216 閱讀 2608

如果乙個軟體被解除安裝,那答案就是它所有已安裝的子孫的個數;如果安裝,就是它到根的鏈上沒安裝的個數.(注意修改lazy的時候)

1 #include2 #include3 #include4 #include5

6using

namespace

std;78

int n,head[100001],rk[100001

],tot,p,js,js2;

9struct

kkk e[200001

];12

struct

dian q[100001

];15

struct

xianduan a[400001

];18

19 inline void add(int x,int

y) 24

25 inline void dfs1(int rt,int fa,int

deep) 37}

3839 inline void dfs2(int rt,int

topf) 50}

5152 inline void spr(int

rt)

58if(a[rt].lazy == -1

) 62 a[rt*2].lazy =a[rt].lazy;

63 a[rt*2+1].lazy =a[rt].lazy;

64 a[rt].lazy = 0;65

}6667 inline void build(int rt,int ll,int

rr)

7778 inline int ssum(int rt,int l,int

r) 91

92 inline int treeadd(int x,int

y) 100 uu += ssum(1

,q[y].id,q[x].id);

101return

uu;102

}103

104 inline void change(int rt,int l,int

r) 111

spr(rt);

112int mid = a[rt].l + a[rt].r >> 1

;113

if(l <= mid) change(rt * 2

,l,r);

114if(r > mid) change(rt * 2 + 1

,l,r);

115 a[rt].v = a[rt*2].v + a[rt*2+1

].v;

116117

}118

119 inline void treechange(int x,int

y) 126

//if(q[x].d >= q[y].d)

127 change(1

,q[y].id,q[x].id);

128}

129130 inline void change1(int rt,int l,int

r) 136

spr(rt);

137int mid = a[rt].l + a[rt].r >> 1

;138

if(l <= mid) change1(rt * 2

,l,r);

139if(r > mid) change1(rt * 2 + 1

,l,r);

140 a[rt].v = a[rt*2].v + a[rt*2+1

].v;

141//

printf("%d %d : %d\n",a[rt].l,a[rt].r,a[rt].v);

142}

143144

intmain()

153 dfs1(1,0,1

);154 tot = 0

;155 dfs2(1,1

);156 build(1,1

,n);

157 scanf("

%d",&p);

158//

for(int i = 1;i <= n; i++)

159//

printf("%d ",q[i].id);

160for(int i = 1;i <= p; i++)

171else

179}

180return0;

181 }

洛谷 P2146 NOI2015 軟體包管理器

題解原發於我的blog 首先,很明顯這是一道樹鏈剖分的題。注意到乙個軟體只會以來乙個軟體,並且不會出現環,所以每次都可以連一條 x i 的邊。當安裝乙個軟體時,就把 1 x 的路徑上所有的點的轉態變為 1 但解除安裝乙個軟體時,就把 x 及它的所有的子樹變為 0 線段樹維護即可 推薦一道樹鏈剖分的好...

P2146 NOI2015 軟體包管理器

很好的樹剖板子題 操作一 求點x到0的最短路徑 經過的結點個數 路徑上已安裝的軟體包的總個數,同時將經過的路徑上的所有點標記為已安裝。操作二 將子樹代表的那段存安裝包個數的區間清空 或者是說將其sum值賦值為0 此處為了實現標記已安裝和清空,我們用了乙個標記add add i 1 線段樹上的點i及其...

P2146 NOI2015 軟體包管理器

輸入格式 從檔案manager.in中讀入資料。輸入檔案的第1行包含1個整數n,表示軟體包的總數。軟體包從0開始編號。隨後一行包含n 1個整數,相鄰整數之間用單個空格隔開,分別表示1,2,3,n 2,n 1號軟體包依賴的軟體包的編號。接下來一行包含1個整數q,表示詢問的總數。之後q行,每行1個詢問。...