樹鏈剖分 在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...