Submission #167605

#TimeUsernameProblemLanguageResultExecution timeMemory
167605TricksterEvacuation plan (IZhO18_plan)C++14
0 / 100
740 ms11760 KiB
//Suleyman Atayew #include <algorithm> #include <iostream> #include <string.h> #include <stdio.h> #include <vector> #include <queue> #include <cmath> #include <map> #include <set> #define N 100010 #define ff first #define ss second #define pb push_back #define ll long long #define inf 1000000007 #define pii pair <int, int> using namespace std; pii T[N]; int dis[N]; int vis[N]; int a, b, c; int n, m, k, q; vector <pii> E[N]; int A[N], L[N], R[N], Pr[N]; priority_queue <pii, vector <pii>, greater <pii>> Q; int ata(int x) { if(Pr[x] == x) return x; return Pr[x] = ata(Pr[x]); } void uni(int a, int b) { a = ata(a); b = ata(b); if(a == b) return; Pr[b] = a; } int main() { cin >> n >> m; for(int i = 1; i <= m; i++) { cin >> a >> b >> c; E[a].pb({b, c}); E[b].pb({a, c}); } cin >> k; for(int i = 1; i <= n; i++) dis[i] = 1e9; for(int i = 1; i <= k; i++) { cin >> a; dis[a] = 0, Q.push({0, a}); } while(!Q.empty()) { int nd = Q.top().ss; Q.pop(); if(vis[nd] == 1) continue; vis[nd] = 1; for(auto i: E[nd]) { int to = i.ff; int yol = i.ss; if(dis[to] > dis[nd] + yol) dis[to] = dis[nd] + yol, Q.push({dis[to], to}); } } pii arr[N]; for(int i = 1; i <= n; i++) arr[i] = {dis[i], i}; sort(arr + 1, arr + n + 1); cin >> q; for(int i = 1; i <= q; i++) { cin >> a >> b; T[i] = {a, b}; L[i] = 1, R[i] = 15; } for(int i = 1; i <= 10; i++) { vector <pii> MD; for(int h = 1; h <= q; h++) { if(R[h] < L[h]) continue; int md = (L[h] + R[h]) / 2; MD.pb({md, h}); } for(int h = 1; h <= n; h++) Pr[h] = h; sort(MD.begin(), MD.end()); reverse(MD.begin(), MD.end()); int x = 0; memset(vis, 0, sizeof(vis)); for(int h = n; h >= 1; h--) { while(x < MD.size() && MD[x].ff > arr[h].ff) { int j = MD[x].ss; int md = MD[x].ff; int a = ata(T[j].ff); int b = ata(T[j].ss); if(a == b) { L[j] = md+1; A[j] = md; } else R[j] = md-1; x++; } int nd = arr[h].ss; for(auto j: E[nd]) if(vis[j.ff] == 1) uni(j.ff, nd); vis[nd] = 1; } while(x < MD.size()) { int j = MD[x].ss; int md = MD[x].ff; int a = ata(T[j].ff); int b = ata(T[j].ss); if(a == b) { L[j] = md+1; A[j] = md; } else R[j] = md-1; x++; } } for(int i = 1; i <= q; i++) cout << A[i] << "\n"; }

Compilation message (stderr)

plan.cpp: In function 'int main()':
plan.cpp:118:12: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    while(x < MD.size() && MD[x].ff > arr[h].ff) {
          ~~^~~~~~~~~~~
plan.cpp:142:11: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   while(x < MD.size()) {
         ~~^~~~~~~~~~~
#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...