Submission #1316789

#TimeUsernameProblemLanguageResultExecution timeMemory
1316789athenaGrapevine (NOI22_grapevine)C++20
0 / 100
3094 ms15512 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long int 
void bfs(vector<vector<pair<int,int>>>&adj,int n,int s,vector<int>&dis,vector<bool>&vis,vector<int>&p,vector<vector<int>>&c)
{
    queue<pair<int,int>>q;
    q.push({s,0});
    while(!q.empty())
    {
        auto [y,w]=q.front();q.pop();
        vis[y]=1;
        for(auto [u,v]:adj[y])
        {
            if(!vis[u])
            {
                p[u]=y;
                c[y].push_back(u);
                dis[u]=dis[y]+v;
                q.push({u,v});
            }
        }
    }
}
int32_t main(){
    int n,q;
    cin>>n>>q;
    vector<vector<pair<int,int>>>adj(n+1);
    for(int i=0;i<n-1;i++)
    {
        int x,y,w;
        cin>>x>>y>>w;
        adj[x].push_back({y,w});
        adj[y].push_back({x,w});
    }
    vector<int>dis(n+1);
    vector<bool>vis(n+1,false);
    vector<int>p(n+1);
    vector<int>gpe(n+1,0);
    vector<vector<int>>c(n+1);
    // vis.assign(n+1,0);
      // dis.assign(n+1,0);
       bfs(adj,n,1,dis,vis,p,c);
   // for(int i=1;i<=n;i++)
   // cout<<dis[i]<<" ";
   // cout<<endl;
  //  for(int i=1;i<=n;i++)
  // cout<<c[i]<<" ";
   while(q--)
   {
       int t;
       cin>>t;
       if(t==1)//seek
       {int s;
       cin>>s;
      
           int ans=1e18;
           for(int i=1;i<=n;i++)
           {
               if(gpe[i]==1)
               {
                   ans=min(ans,dis[i]);
               }
           }
           if(ans==1e18)
           cout<<-1<<endl;
           else
           cout<<ans<<endl;
       }
       if(t==2)
       {
           int x;
           cin>>x;
           if(gpe[x]==1)
           gpe[x]=0;
           else
           gpe[x]=1;
       }
       if(t==3)
       {
           int x,y,w;
           cin>>x>>y>>w;
           if(p[x]==y)//y parent
            {long long old_w = dis[x] - dis[y];
            long long delta = w - old_w;
            
            queue<int> qq;
            qq.push(x);
            while(!qq.empty()){
                int v = qq.front(); qq.pop();
                dis[v] += delta;
                for(int u: c[v]) qq.push(u);
            }
            }
           else//x parent
           {long long old_w = dis[y] - dis[x];
            long long delta = w - old_w;
            
            queue<int> qq;
            qq.push(y);
            while(!qq.empty()){
                int v = qq.front(); qq.pop();
                dis[v] += delta;
                for(int u: c[v]) qq.push(u);
            }
             }
            // cout<<"NEW "<<endl;
            //  for(int i=1;i<=n;i++)
            //cout<<dis[i]<<" ";
           // cout<<endl;
           
       }
   }
    
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...