Submission #341607

#TimeUsernameProblemLanguageResultExecution timeMemory
341607TosicEvacuation plan (IZhO18_plan)C++14
100 / 100
1466 ms59336 KiB
#include <bits/stdc++.h> #define maxn 100010 using namespace std; int n, m, k, ans, iT[maxn], oT[maxn], gT; vector<pair<int, pair<int, int>>> allEdgs; vector<pair<int, int>> allVr; vector<vector<pair<int, int>>> gr,tree; multiset<pair<int, int> > cl; int par[maxn], mxVal[maxn], anc[maxn][20], minV[maxn][20]; int getP(int x){ if(par[x] != x){ par[x] = getP(par[x]); } return par[x]; } bool join(int x, int y){ x = getP(x); y = getP(y); if(x != y){ par[min(x,y)] = max(x,y); return true; } return 0; } void maxS(){ sort(allVr.begin(), allVr.end()); reverse(allVr.begin(), allVr.end() ); for(int i = 0; i < allVr.size(); ++i){ auto tmp = allVr[i]; int u = tmp.second; for(auto tmpV:gr[u]){ int v = tmpV.second; if(mxVal[v] >= mxVal[u] and join(u, v) ){ tree[u].push_back({tmp.first, v}); tree[v].push_back({tmp.first, u}); } } } } void dfs(int x, int p){ iT[x] = gT;++gT; anc[x][0] = p; minV[x][0] = mxVal[x]; //minV[x][0] = min(minV[x][0], mxVal[p]); for(int i = 1; i < 20; ++i){ anc[x][i] = anc[anc[x][i-1]][i-1]; minV[x][i] = min(minV[x][i-1], minV[anc[x][i-1]][i-1]); } for(auto i : tree[x]){ if(i.second != p){ dfs(i.second, x); } } oT[x] = gT; ++gT; } bool isX(int x, int y){ return (iT[x] <= iT[y] and oT[x] >= oT[y]); } int Lca(int x, int y){ if(isX(x, y)){ return x; } else if(isX(y, x)){ return y; } else { for(int i = 19; i >= 0; --i){ if(!isX(anc[x][i], y)){ x = anc[x][i]; } } return anc[x][0]; } return 0; } int getV(int lca, int x){ // lca is above x int res = minV[x][0]; for(int i = 19; i >= 0; --i){ if(!isX(anc[x][i], lca)){ res = min(res, minV[x][i]); x = anc[x][i]; res = min(res, minV[x][0]); } } res=min(res,minV[lca][0]); return res; } int getD(int x, int y){ for(auto i : gr[x]){ if(i.second == y){ return min(mxVal[x], mxVal[y]); } } int lca = Lca(x, y); int res = min(getV(lca, x), getV(lca, y)); return res; } int main(){ ios_base::sync_with_stdio(0); cout.tie(0); cin.tie(0); cin >> n >> m; gr.resize(n+1, vector<pair<int, int>>()); tree = gr; for(int i = 0; i < m; ++i){ int u,v,w; cin >> u >> v >> w; --u, v--; gr[u].push_back({w, v}); gr[v].push_back({w, u}); } cin >> k; for(int i = 0; i < n; ++i){ mxVal[i] = 1e9; par[i] = i; } for(int i = 0; i < k; ++i){ int idx; cin>>idx; --idx; cl.insert({0, idx}); mxVal[idx] = 0; } while(!cl.empty()){ int dst = cl.begin()->first, idx = cl.begin()->second; cl.erase(cl.begin()); //cerr << dst << '\n'; for(auto i : gr[idx]){ if(mxVal[i.second] > dst + i.first){ auto tmp = cl.find({mxVal[i.second], i.second}); if(tmp != cl.end()){ cl.erase(tmp); } mxVal[i.second] = dst+i.first; cl.insert({mxVal[i.second], i.second}); } } } for(int i = 0; i < n; ++i){ for(auto j : gr[i]){ allEdgs.push_back( make_pair(min(mxVal[i],mxVal[j.second]), make_pair(i, j.second) )); } allVr.push_back({mxVal[i], i}); } //cerr << 'a'; maxS(); //cerr << 'b'; dfs(0, 0); int q; cin>>q; for(int i = 0; i < q; ++i){ int x, y; cin >> x >> y; --x,--y; cout << getD(x, y) << '\n'; } /*9 12 1 9 4 1 2 5 2 3 7 2 4 3 4 3 6 3 6 4 8 7 10 6 7 5 5 8 1 9 5 7 5 4 12 6 8 2 2 4 7 5 1 6 5 3 4 8 5 8 1 5*/ }

Compilation message (stderr)

plan.cpp: In function 'void maxS()':
plan.cpp:32:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   32 |  for(int i = 0; i < allVr.size(); ++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...