樹鏈剖分 區間覆蓋(NOI2015 軟體包管理器)

2021-08-23 14:32:16 字數 2381 閱讀 7258

這道題題面很長,但歸根結底,其實就是道板子題:我們設「1」表示該軟體沒有被安裝,「0」代表已經安

裝。那麼install操作就是先求出從該節點到根節點最短路徑上的所有點權之和,再將該點到根節點的最短路

徑上的所有點權全修改為「0」,uninstall與之相反,並且操作區間為該點對應的子樹。

線段樹區間覆蓋其實特別簡單,只不過將傳統線段樹中的區間修改,下傳標記中所有的「+=」改為「=」,這樣就實現了區間覆蓋。

#include

#include

#include

#include

#include

using

namespace

std;

#define half (l+r)>>1;

const

int maxn=200006;

int head[maxn],cur,son[maxn],tot[maxn],fa[maxn],top[maxn],id[maxn],val[maxn],bval[maxn],d[maxn],n,m;

struct hzw

e[maxn];

struct ljm

t[maxn];

inline

void add(int a,int b)

//**************************

int num=1;

inline

void build (int s,int l,int r)

int mid=half;

t[s].lc=++num;

build(t[s].lc,l,mid);

t[s].rc=++num;

build (t[s].rc,mid+1,r);

t[s].w=t[t[s].rc].w+t[t[s].lc].w;

}inline

void pushdown(int s,int l,int r)

inline

void update(int s,int l,int r,int ll,int rr,int v)

if (t[s].tag!=-1) pushdown(s,l,r);

int mid=half;

if (rr<=mid) update(t[s].lc,l,mid,ll,rr,v);

else

if (ll>mid) update(t[s].rc,mid+1,r,ll,rr,v);

else

t[s].w=t[t[s].lc].w+t[t[s].rc].w;/*任何線段樹都不是

t[s].w+=t[t[s].lc].w+t[t[s].rc].w; */

}inline

int query(int s,int l,int r,int ll,int rr)

if (t[s].tag!=-1) pushdown(s,l,r);

int mid=half;

if (rr<=mid) ans+=query(t[s].lc,l,mid,ll,rr);

else

if (ll>mid) ans+=query(t[s].rc,mid+1,r,ll,rr);

else

return ans;

}bool vis[maxn];

//*************************

inline

int dfs1(int s,int f,int l)

}return tot[s];

}int cnt=0;

inline

void dfs2(int s,int firs)

}inline

void chang(int x,int y,int v)

if (d[x]>d[y]) std::swap(x,y);

update(1,1,n,id[x],id[y],v);

}inline

int sum_(int x,int y)

if (d[x]>d[y]) std::swap(x,y);

ans+=query(1,1,n,id[x],id[y]);

return ans;

}inline

void tchang(int x,int v)

inline

int tsum(int x)

int main()

dfs1(1,1,1);

dfs2(1,1);

build (1,1,n);

std::cin>>m;

std::string q;

int p;

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

else

}return

0;}

noi2015 軟體包管理器 樹鏈剖分)

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

Noi2015 軟體包管理器 樹鏈剖分

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

NOI2015 軟體包管理器 樹鏈剖分

題面 題解 首先我們觀察到0號不會依賴別人,而其他的軟體都會依賴且僅會依賴乙個軟體。因此這是一棵樹。於是我們在看看要支援一些什麼操作。1,安裝乙個軟體要改變多少軟體的狀態。如果將乙個軟體與所依賴的軟體相連,那麼可能要改變的狀態就是它自己和往上走直到根的那條鏈上的點。2,解除安裝乙個軟體要改變多少軟體...