Submission #557184

#TimeUsernameProblemLanguageResultExecution timeMemory
557184MilosMilutinovicInside information (BOI21_servers)C++14
50 / 100
248 ms30428 KiB
#include <bits/stdc++.h> using namespace std; #define pb push_back #define mp make_pair #define pii pair<int,int> const int N=120050; const int M=2*N; const int L=20; int n,q,op[M],x[M],y[M],par[N][L],dep[N],w[N],up[N],dw[N]; vector<pii> E[N]; void DFS1(int u,int p){ if(w[u]>w[p])dw[u]=dw[p],up[u]=p; else up[u]=up[p],dw[u]=p; dep[u]=dep[p]+1; par[u][0]=p; for(int i=1;i<L;i++)par[u][i]=par[par[u][i-1]][i-1]; for(auto e:E[u])if(e.first!=p){ w[e.first]=e.second; DFS1(e.first,u); } } int LCA(int u,int v){ if(dep[u]<dep[v])swap(u,v); for(int i=L-1;~i;i--)if(dep[par[u][i]]>=dep[v])u=par[u][i]; for(int i=L-1;~i;i--)if(par[u][i]!=par[v][i])u=par[u][i],v=par[v][i]; return u==v?u:par[u][0]; } int Lift(int u,int k){for(int i=L-1;i>=0;i--)if(k>>i&1)u=par[u][i];return u;} bool conn(int u,int v,int t){ bool ok=true; int lca=LCA(u,v); if(u!=lca&&v!=lca){ int pu=Lift(u,dep[u]-dep[lca]-1); int pv=Lift(v,dep[v]-dep[lca]-1); if(w[pu]<w[pv])ok=false; } if(u!=lca&&dep[lca]<dep[dw[u]])ok=false; if(v!=lca&&dep[lca]<dep[up[v]])ok=false; if(u!=lca&&w[u]>t)ok=false; if(v!=lca&&w[Lift(v,dep[v]-dep[lca]-1)]>t)ok=false; return ok; } int main(){ scanf("%i%i",&n,&q); q+=n-1; for(int i=1;i<=q;i++){ char ch; scanf("\n%c %i",&ch,&x[i]); op[i]=(ch=='S'?1:(ch=='Q'?2:3)); if(op[i]!=3)scanf("%i",&y[i]); if(op[i]==1){ E[x[i]].pb(mp(y[i],i)); E[y[i]].pb(mp(x[i],i)); } } w[1]=1000000; up[1]=dw[1]=1; DFS1(1,1); for(int i=1;i<=q;i++){ if(op[i]==1)continue; if(op[i]==2){ puts(conn(x[i],y[i],i)?"yes":"no"); continue; } } return 0; }

Compilation message (stderr)

servers.cpp: In function 'int main()':
servers.cpp:44:7: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   44 |  scanf("%i%i",&n,&q);
      |  ~~~~~^~~~~~~~~~~~~~
servers.cpp:48:8: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   48 |   scanf("\n%c %i",&ch,&x[i]);
      |   ~~~~~^~~~~~~~~~~~~~~~~~~~~
servers.cpp:50:20: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   50 |   if(op[i]!=3)scanf("%i",&y[i]);
      |               ~~~~~^~~~~~~~~~~~
#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...
#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...