樹鏈剖分維護。
1表示安裝的狀態,0表示沒有安裝的狀態。
如果install就是把當前點到根的所有點都變成1,然後計算前後的\(\delta\)
如果uninstall呢,就是把自己的子樹變成0,答案也是前後的\(\delta\)
具體可以參照**(不過我的**常數好大啊,跑得好慢。。。。)
**如下:
#include#include#include#include#define maxn 400010
using namespace std;
inline int read()
while(ch>='0'&&ch<='9')
return x*f;
}int n,m,t,tot;
int head[maxn],sum[maxn],tag[maxn],siz[maxn],top[maxn],dep[maxn],son[maxn],id[maxn],fa[maxn];
char cur[20];
struct edgeedge[maxn<<1];
inline int ls(int x)
inline int rs(int x)
inline void add(int from,int to,int dis)
inline void push_up(int x)
inline void push_down(int x,int l,int r)
else
tag[x]=0;
}inline void update(int x,int l,int r,int ll,int rr,int k)
int mid=(l+r)>>1;
push_down(x,l,r);
if(ll<=mid) update(ls(x),l,mid,ll,rr,k);
if(mid>1;
push_down(x,l,r);
int cur_ans=0;
if(ll<=mid) cur_ans+=query(ls(x),l,mid,ll,rr);
if(midmaxx) maxx=siz[v],son[x]=v;}}
}inline void dfs2(int x,int topf)
}inline int modify(int x,int y,int k)
if(dep[x]cur_ans-=query(1,1,n,id[y],id[x]);
update(1,1,n,id[y],id[x],k);
cur_ans+=query(1,1,n,id[y],id[x]);
return cur_ans;
}int main()
m=read();
dfs1(1,0);
dfs2(1,1);
for(int i=1;i<=m;i++)
}return 0;
}
noi2015軟體包管理器
你決定設計你自己的軟體包管理器。不可避免的,你要解決軟體包之間的依賴關係。如果a依賴b,那麼安裝a之前需安裝b,解除安裝b之前須解除安裝a。0號軟體包不依賴任何軟體包。依賴關係不存在環 包括自環 你的任務是,求出每次安裝 刪除操作會改變多少個包的狀態。安裝乙個已安裝的軟體包,或者解除安裝乙個未安裝的...
Noi2015 軟體包管理器
time limit 10 sec memory limit 512 mb 你決定設計你自己的軟體包管理器。不可避免地,你要解決軟體包之間的依賴問題。如果軟體包a依賴軟體包b,那麼安裝軟體包a以前,必須先安裝軟體包b。同時,如果想要解除安裝軟體包b,則必須解除安裝軟體包a。現在你已經獲得了所有的軟體...
NOI 2015 軟體包管理器
問題描述 你決定設計你自己的軟體包管理器。不可避免地,你要解決軟體包之間的依賴問題。如果軟體包 a 依賴軟體包 b 那麼安裝軟體包 a 以前,必須先安裝軟體包 b 同時,如果想要解除安裝軟體包 b 則必須解除安裝軟體包 a 現在你已經獲得了所有的軟體包之間的依賴關係。而且,由於你之前的工作,除 0 ...