优化空间即可
#include <bits/stdc++.h>
using namespace std;
#define ld long double
#define int long long
#define mod 998244353
#define endl "\n"
vector<int> pa(100005),id(100005),sz(100005),ans(100005);
vector<int> adj[100005],js[100005];
vector<pair<int,int>> info(100005);
void dfs(int cur,int V,vector<int>& dp,int t){
if(cur){
auto tdp=dp;
for(int i=0;i<=V;i++){
if(tdp[i]==1e18)continue;
dp[i^info[cur].first]=min(dp[i^info[cur].first],tdp[i]+info[cur].second);
}
t^=info[cur].first;
}
for(auto i:js[cur])ans[i]=dp[t];
for(int i=0;i+1<adj[cur].size();i++){
auto tdp=dp;
dfs(adj[cur][i],V,tdp,t);
}
if(adj[cur].size())dfs(adj[cur].back(),V,dp,t);
}
void solve(){
int n;
cin>>n;
int cur=0;
int ti=1;
for(int i=1;i<=n;i++){
string s;
cin>>s;
if(s=="ADD"){
cin>>info[ti].first>>info[ti].second;
adj[cur].push_back(ti);
pa[ti]=cur;
sz[ti]=1;
cur=ti++;
}
else {
sz[pa[cur]]+=sz[cur];
cur=pa[cur];
auto cmp=[&](int a,int b)->bool{
return sz[a]<sz[b];
};
sort(js[cur].begin(),js[cur].end(),cmp);
}
js[cur].push_back(i);
}
while(cur){
sz[pa[cur]]+=sz[cur];
cur=pa[cur];
auto cmp=[&](int a,int b)->bool{
return sz[a]<sz[b];
};
sort(js[cur].begin(),js[cur].end(),cmp);
}
int V=1<<15;
vector<int> dp(V+1,1e18);
dp[0]=0;
dfs(cur,V,dp,0);
for(int i=1;i<=n;i++)cout<<ans[i]<<endl;
}
signed main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int t = 1;
// cin >> t;
while(t--){
solve();
}
return 0;
}
查看3道真题和解析
