bzoj 4196 軟體包管理器

2022-06-01 07:03:08 字數 1610 閱讀 2756

題目大意:

一棵樹,開始所有點權值為0 支援兩種操作:

① 將它到根路徑上所有點(包括自己與根)的權值都變為1 求點權被改變的點的個數

② 將它的子樹內所有點以及自己的權值變為1 求點權被改變的點的個數

思路:看懂了題之後就很裸了

然後我因為pushdown的tag向下傳遞少打了右子樹的「|1」調了好久

orz

1 #include2 #include3 #include4 #include5 #include6 #include7 #include8 #include9

#define inf 2139062143

10#define ll long long

11#define maxn 101010

12using

namespace

std;

13 inline int

read()

1417

while(isdigit(ch))

18return x*f;19}

20int nxt[maxn<<1],fst[maxn],n,to[maxn<<1

],cnt;

21int

cnt[maxn],bl[maxn],fa[maxn],dep[maxn],hsh[maxn];

22struct data tr[maxn<<2

];23

void add(int u,int v)

24void dfs(int

x)2534}

35void dfs(int x,int

anc)

3645

void build(int k,int l,int

r)46

53void pushdown(int

k)54

60void upd(int k,int a,int b,int

x)61

64if

(tr[k].tag) pushdown(k);

65int mid=(l+r)>>1;66

if(mid>=b) upd(k<<1

,a,b,x);

67else

if(mid1|1

,a,b,x);

68else

69 tr[k].sum=tr[k<<1].sum+tr[k<<1|1

].sum;70}

71int query(int k,int a,int

b)72

81int

main()

8285 dep[1]=1

;86 dfs(1);cnt=0

;87 dfs(1,1

);88 build(1,1

,n);

89int t=read();char ch[18

];90

inta,res;

91while(t--)

92102

}103

else

104108 printf("

%d\n

",res);

109}

110 }

view code

軟體包管理器(bzoj 4196)

你決定設計你自己的軟體包管理器。不可避免地,你要解決軟體包之間的依賴問題。如果軟體包a依賴軟體包b,那麼安裝軟體包a以前,必須先安裝軟體包b。同時,如果想要解除安裝軟體包b,則必須解除安裝軟體包a。現在你已經獲得了所有的軟體包之間的依賴關係。而且,由於你之前的工作,除0號軟體包以外,在你的管理器當中...

bzoj4196軟體包管理器 noi2015

你決定設計你自己的軟體包管理器。不可避免地,你要解決軟體包之間的依賴問題。如果軟體包a依賴軟體包b,那麼安裝軟體包a以前,必須先安裝軟體包b。同時,如果想要解除安裝軟體包b,則必須解除安裝軟體包a。現在你已經獲得了所有的軟體包之間的依賴關係。而且,由於你之前的工作,除0號軟體包以外,在你的管理器當中...

4196 Noi2015 軟體包管理器

用樹剖搞出dfs序,這樣能把一棵子樹變成乙個區間,一條鏈變成log個區間。用線段樹維護一段連續的dfs序中有幾個點。共兩種操作 第乙個加點,將log個區間中的總點數統計出來,然後填滿,答案為 區間長度 原有點數 複雜度o n logn 2 第二個刪點,把一段區間中的總點數統計出來作為答案,然後全部清...