原題傳送門
題意:給你一棵樹,有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...