求调
查看原帖
求调
482610
Mortidesperatslav楼主2024/1/3 19:57

16pts。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
int n,q,m,k,r,p,vst,cnt;
ll a[200005];
int fa[200005],hs[200005],sz[200005],top[200005],dfn[200005],rdfn[200005],dep[200005];
vector<int>G[200005];
int f[16][200005],ans[200005],w[200005],v[200005],id[200005],vs[200005];
stack<int>s;
void dfs(int u,int fat) {
	fa[u]=fat;
	vs[u]=1;
	sz[u]=1;
	dep[u]=dep[fat]+1;
	for(auto &v:G[u]) {
		if(v==fat)continue;
		dfs(v,u);
		sz[u]+=sz[v];
		if(sz[v]>sz[hs[u]])hs[u]=v;
	}
}
void cut(int u,int tp,int dep,int lst) {
	for(int i=0;i<=m;i++){
		f[dep][i]=f[lst][i];
		if(i>=w[u])f[dep][i]=max(f[dep][i],f[dep][i-w[u]]+v[u]);
		ans[u]=max(ans[u],f[dep][i]);
	}
	dfn[u]=++vst;
	rdfn[vst]=u;
	top[u]=tp;
	if(hs[u]) {
		cut(hs[u],tp,dep,dep);
		for(auto &v:G[u])if(v!=fa[u]&&v!=hs[u])cut(v,v,dep+1,dep);
	}
}
int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>q>>m;
	for(int ii=1;ii<=q;ii++){
	//	cerr<<ii<<"\n";
		string t;
		cin>>t;
		if(t=="add"){
			cnt++;
			if(!s.empty()){
				G[s.top()].push_back(cnt);
				G[cnt].push_back(s.top());
			}
			cin>>w[cnt]>>v[cnt];
			s.push(cnt);
		}else s.pop();
		if(!s.empty())id[ii]=s.top();
	}
	for(int i=1;i<=cnt;i++){
		if(vs[i])continue;
		dfs(i,0);
		cut(i,0,1,0);
	}
	for(int i=1;i<=q;i++)cout<<ans[id[i]]<<"\n"; 
}
2024/1/3 19:57
加载中...