제출 #1232670

#제출 시각아이디문제언어결과실행 시간메모리
1232670Hamed_GhaffariRoller Coaster Railroad (IOI16_railroad)C++20
100 / 100
167 ms12736 KiB
#include "railroad.h" #include <bits/stdc++.h> using namespace std; using ll = long long; using tri = tuple<int, int, int>; const int MXN = 2e5+5; int dsu[MXN<<1]; int find(int v) { return v==dsu[v] ? v : dsu[v] = find(dsu[v]); } ll plan_roller_coaster(vector<int> s, vector<int> t) { int n = (int) s.size(); vector<int> cmp; cmp.push_back(1); cmp.push_back(1e9); for(int i=0; i<n; i++) cmp.push_back(s[i]), cmp.push_back(t[i]); sort(cmp.begin(), cmp.end()); cmp.resize(unique(cmp.begin(), cmp.end())-cmp.begin()); auto GI = [&](int x) -> int { return lower_bound(cmp.begin(), cmp.end(), x)-cmp.begin(); }; iota(dsu, dsu+cmp.size(), 0); vector<int> p(cmp.size(), 0); p[cmp.size()-1]++; p[0]--; dsu[find(0)] = find(cmp.size()-1); for(int i=0; i<n; i++) p[GI(s[i])]++, p[GI(t[i])]--, dsu[find(GI(s[i]))] = find(GI(t[i])); vector<tri> E; ll ans = 0; for(int i=0; i+1<p.size(); i++) { if(i) p[i] += p[i-1]; if(p[i]) dsu[find(i)] = find(i+1); else E.push_back({cmp[i+1]-cmp[i], i, i+1}); if(p[i]>0) ans += 1ll*p[i]*(cmp[i+1]-cmp[i]); } sort(E.begin(), E.end(), [&](tri x, tri y) { return get<0>(x)<get<0>(y); }); for(tri e : E) { int u = find(get<1>(e)), v = find(get<2>(e)); if(u!=v) { ans += get<0>(e); dsu[u] = v; } } return ans; }

컴파일 시 표준 에러 (stderr) 메시지

railroad.h:1:9: warning: #pragma once in main file
    1 | #pragma once
      |         ^~~~
railroad_c.h:1:9: warning: #pragma once in main file
    1 | #pragma once
      |         ^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...