优化空间即可

#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;

}

全部评论
为啥sort方向改一下,重链搜也能过,我不理解
点赞 回复 分享
发布于 2025-05-22 21:16 湖北

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务