這道題題面很長,但歸根結底,其實就是道板子題:我們設「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,解除安裝乙個軟體要改變多少軟體...