BZOJ4196 Noi2015 軟體包管理器

2022-09-18 09:06:41 字數 1260 閱讀 2739

原題傳送門

題意:給你一棵樹,有2種操作:

1.使得某個點到根節點路徑上的所有點權值賦為1。

2.使得某節點的子樹中所有節點權值賦為0.

每次操作要求輸出權值更改的節點個數。

解題思路:

顯然是用樹剖來解決問題,考慮用區間賦值的線段樹維護區間內1的個數,然後直接按題意樹剖求解即可。

操作1的時間效率為\( o ( \log^ n) \) ,操作2的時間效率為\( o( \log n) \) ,總時間複雜度最壞為\( o (m \log^ n) \).

bzoj上跑了5900ms,6960kb

#include #define mn 100005

#define mn (1<<17)

#define ls (k<<1)

#define rs (k<<1|1)

#define mid (l+r>>1)

#define v edge[i].to

int mark[mn<<1],sum[mn<<1

],siz[mn],dep[mn],son[mn],fa[mn],top[mn],head[mn],cnt,n,q,dfsn,l[mn],r[mn];

struct zxyedge[mn];

inline

void ins(int x,int y)

inline

intin

()inline

void dfs1(int u,intd)}

inline

void dfs2(int u,int

tp)inline

void pushdown(int k,int l,int

r)inline

void a(int l,int r,int a,int b,int k,int

ad) pushdown(k,l,r);

if (a<=mid) a(l,mid,a,b,ls,ad);

if (b>mid) a(mid+1,r,a,b,rs,ad);sum[k]=sum[ls]+sum[rs];

}inline

int q(int l,int r,int a,int b,int

k)inline

int install(int

x)inline

int uninstall(int

x)void

init()

void

solve()

}int main()

bzoj4196 NOI2015 軟體包管理器

time limit 10 sec memory limit 512 mb submit 1168 solved 672 你決定設計你自己的軟體包管理器。不可避免地,你要解決軟體包之間的依賴問題。如果軟體包a依賴軟體包b,那麼安裝軟體包a以前,必須先安裝軟體包b。同時,如果想要解除安裝軟體包b,則必...

bzoj 4196 Noi2015 軟體包管理器

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

bzoj4196 Noi2015 軟體包管理器

題目大意 有一棵樹,兩個修改 install x 把根節點到 x 軟體路徑上的值全部變為 1 並輸出修改的節點個數 uninstall x 把 x 以及它的子樹的值變為 0 並輸出修改的節點個數 題解 樹鏈剖分,比較一下修改前後值的變化,即為答案 卡點 1.邊忘記開兩倍 c code include...