題目大意:
一棵樹,開始所有點權值為0 支援兩種操作:
① 將它到根路徑上所有點(包括自己與根)的權值都變為1 求點權被改變的點的個數
② 將它的子樹內所有點以及自己的權值變為1 求點權被改變的點的個數
思路:看懂了題之後就很裸了
然後我因為pushdown的tag向下傳遞少打了右子樹的「|1」調了好久
orz
1 #include2 #include3 #include4 #include5 #include6 #include7 #include8 #include9view code#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 }
軟體包管理器(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 第二個刪點,把一段區間中的總點數統計出來作為答案,然後全部清...