NOI2015 軟體包管理器

2022-03-03 17:27:30 字數 1464 閱讀 6564

樹鏈剖分維護。

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 ...