Submission #170771

#TimeUsernameProblemLanguageResultExecution timeMemory
170771juggernautEvacuation plan (IZhO18_plan)C++14
0 / 100
358 ms60764 KiB
//Just try and the idea will come! #include<bits/stdc++.h> #define int long long int using namespace std; int n,m,x,y,z,v,dis[100001],i,par[100001],sz[100001],tin[100001],tout[100001],timer,up[100001][20],mn[100001][20]; vector<pair<int,int>>p; vector<vector<pair<int,int>>>g(100001); vector<pair<int,pair<int,int>>>vec; int fin(int v){ if(v==par[v])return v; return par[v]=fin(par[v]); } void dfs(int v,int p,int cost){ tin[v]=timer++; up[v][0]=p; mn[v][0]=cost; for(int i=1;i<20;i++){ up[v][i]=up[up[v][i-1]][i-1]; mn[v][i]=min(mn[v][i-1],mn[up[v][i-1]][i-1]); } for(auto to:g[v])if(to.first!=p)dfs(to.first,v,to.second); tout[v]=timer++; } bool upper(int a,int b){ return tin[a]<tin[b]&&tout[a]>tout[b]; } int lca(int a,int b){ if(upper(a,b))return a; if(upper(b,a))return b; for(int i=19;i>=0;i--)if(!upper(up[a][i],b))a=up[a][i]; return up[a][0]; } int get(int a,int b){ int l=lca(a,b); int res=min(dis[a],dis[b]); if(!upper(l,a)) for(int i=19;i>=0;i--){ if(!upper(up[a][i],l)){ res=min(res,mn[a][i]); a=up[a][i]; } } if(!upper(l,b)) for(int i=19;i>=0;i--){ if(!upper(up[b][i],l)){ res=min(res,mn[b][i]); b=up[b][i]; } } return res; } main(){ scanf("%lld%lld",&n,&m); while(m--){ scanf("%lld%lld%lld",&x,&y,&z); g[x].push_back({y,z}); g[y].push_back({x,z}); p.push_back({x,y}); } for(i=1;i<=n;i++)dis[i]=1e15,par[i]=i,sz[i]=1; scanf("%lld",&m); priority_queue<pair<int,int>>q; while(m--){ scanf("%lld",&x); dis[x]=0; q.push({0,x}); } while(!q.empty()){ v=q.top().second; q.pop(); for(auto to:g[v]) if(dis[to.first]>dis[v]+to.second){ dis[to.first]=dis[v]+to.second; q.push({-dis[to.first],to.first}); } } for(i=0;i<p.size();i++)vec.push_back({min(dis[p[i].first],dis[p[i].second]),{p[i].first,p[i].second}}); for(i=1;i<=n;i++)g[i].clear(); sort(vec.rbegin(),vec.rend()); for(i=0;i<vec.size();i++){ x=fin(vec[i].second.first); y=fin(vec[i].second.second); if(x!=y){ if(sz[x]<sz[y])swap(x,y); par[y]=x; sz[x]+=sz[y]; g[vec[i].second.first].push_back({vec[i].second.second,vec[i].first}); g[vec[i].second.second].push_back({vec[i].second.first,vec[i].first}); } } dfs(1,0,1e15); scanf("%lld",&m); while(m--){ scanf("%lld%lld",&x,&y); printf("query:%lld\n",get(x,y)); } }

Compilation message (stderr)

plan.cpp:52:6: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
 main(){
      ^
plan.cpp: In function 'int main()':
plan.cpp:77:14: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(i=0;i<p.size();i++)vec.push_back({min(dis[p[i].first],dis[p[i].second]),{p[i].first,p[i].second}});
             ~^~~~~~~~~
plan.cpp:80:14: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(i=0;i<vec.size();i++){
             ~^~~~~~~~~~~
plan.cpp:53:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%lld%lld",&n,&m);
     ~~~~~^~~~~~~~~~~~~~~~~~
plan.cpp:55:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%lld%lld%lld",&x,&y,&z);
         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
plan.cpp:61:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%lld",&m);
     ~~~~~^~~~~~~~~~~
plan.cpp:64:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%lld",&x);
         ~~~~~^~~~~~~~~~~
plan.cpp:92:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%lld",&m);
     ~~~~~^~~~~~~~~~~
plan.cpp:94:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%lld%lld",&x,&y);
         ~~~~~^~~~~~~~~~~~~~~~~~
#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...