NOI2015 軟體包管理器 樹鏈剖分

2022-07-23 17:39:19 字數 1818 閱讀 8234

樹鏈剖分 在jacktang的幫助下終於al。。。

這道題剖分後用線段樹維護乙個sum和lazy就可以了;

install操作就是詢問x節點到根節點的路徑上有多少0;然後全部置為1;

uninstall操作就是詢問x節點到根節點的路徑上有多少1;然後全部置為0;

修改的話直接暴力修改就可以了(暴力修改區間的sum和lazy);lazy下放的時候要特別小心;

1 #include2 #include3 #include4

#define ll long long

5using

namespace

std;

6const ll maxn=1e5+10

;7 ll n,m,cnt,head[maxn],nod,size[maxn],pre[maxn],wson[maxn],dfn[maxn],d[maxn],fa[maxn],tp,sum[maxn<<2],lazy[maxn<<2

],a[maxn];

8ll top[maxn];

9char

s[maxn];

10struct

edgee[maxn<<1

];13

inline ll read()

1417

while(c>='

0'&&c<='9')

18return x*f;19}

20inline ll max(ll a,ll b)

2124 inline void

addedge(ll u,ll v)

2530 inline void

dfs1(ll u,ll f)

3142

}43 inline void

dfs2(ll u,ll tp)

4453

}54 inline void pushup(ll k)

55 inline void

pushdown(ll k,ll l,ll r)

5662 inline void

update(ll k,ll l,ll r,ll ql,ll qr,ll v)

6366

if(lazy[k]!=0

)pushdown(k,l,r);

67if(qr<=mid)update(k<<1

,l,mid,ql,qr,v);

68else

if(ql>=mid+1)update(k<<1|1,mid+1

,r,ql,qr,v);

69else update(k<<1,l,mid,ql,mid,v),update(k<<1|1,mid+1,r,mid+1

,qr,v);

70pushup(k);71}

72inline ll query_sum(ll k,ll l,ll r,ll ql,ll qr)

7382

inline ll install(ll x)

8391 ans+=query_sum(1,1,n,dfn[1

],dfn[x]);

92 update(1,1,n,dfn[1],dfn[x],1

);93

return d[tmp]-ans;94}

95inline ll uninstall(ll x)

96101

intmain()

102111 m=read();

112 dfs1(1,0);dfs2(1,1

);113

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

114120

return0;

121 }

noi2015軟體包管理器

你決定設計你自己的軟體包管理器。不可避免的,你要解決軟體包之間的依賴關係。如果a依賴b,那麼安裝a之前需安裝b,解除安裝b之前須解除安裝a。0號軟體包不依賴任何軟體包。依賴關係不存在環 包括自環 你的任務是,求出每次安裝 刪除操作會改變多少個包的狀態。安裝乙個已安裝的軟體包,或者解除安裝乙個未安裝的...

Noi2015 軟體包管理器

time limit 10 sec memory limit 512 mb 你決定設計你自己的軟體包管理器。不可避免地,你要解決軟體包之間的依賴問題。如果軟體包a依賴軟體包b,那麼安裝軟體包a以前,必須先安裝軟體包b。同時,如果想要解除安裝軟體包b,則必須解除安裝軟體包a。現在你已經獲得了所有的軟體...

NOI2015 軟體包管理器

樹鏈剖分維護。1表示安裝的狀態,0表示沒有安裝的狀態。如果install就是把當前點到根的所有點都變成1,然後計算前後的 delta 如果uninstall呢,就是把自己的子樹變成0,答案也是前後的 delta 具體可以參照 不過我的 常數好大啊,跑得好慢。如下 include include in...