Submission #570484

#TimeUsernameProblemLanguageResultExecution timeMemory
570484VirvIdeal city (IOI12_city)C++17
100 / 100
65 ms8096 KiB
#include <algorithm> #include <cassert> #include <functional> #include <iostream> #include <tuple> #include <vector> using u32 = uint32_t; using u64 = uint64_t; using pii = std::pair<u32, u32>; using tiii = std::tuple<u32, u32, u32>; constexpr u32 mod = 1e9; static int foo(int n, int x[], int y[]) { std::vector<pii> p(n); for (int i = 0; i < n; ++i) p[i] = {x[i], y[i]}; sort(p.begin(), p.end()); std::vector<char> f(n, false); std::function<tiii(u32)> const rec = [&](u32 i) -> tiii { // std::cerr << "OPEN\t" << p[i].first << ' ' << p[i].second << '\n'; u32 j = i + 1; while (i > 0 && p[i - 1].first == p[i].first && p[i - 1].second + 1 == p[i].second) --i; while (j < n && p[j - 1].first == p[j].first && p[j - 1].second + 1 == p[j].second) ++j; for (u32 k = i; k < j; ++k) { assert(f[k] == false); f[k] = true; } std::vector<tiii> v; for (auto it = lower_bound(p.begin(), p.end(), pii{p[i].first - 1, p[i].second}) - p.begin(); it < n && p[it] <= pii{p[j - 1].first - 1, p[j - 1].second}; ++it) { if (f[it]) continue; v.push_back(rec(it)); } for (auto it = lower_bound(p.begin(), p.end(), pii{p[i].first + 1, p[i].second}) - p.begin(); it < n && p[it] <= pii{p[j - 1].first + 1, p[j - 1].second}; ++it) { if (f[it]) continue; v.push_back(rec(it)); } u32 close = 0; u32 open = 0; u32 m = j - i; for (auto [b, o, c] : v) { o += b; close = (close + c + (u64)b * open + (u64)m * o) % mod; open = (open + o) % mod; m += b; // std::cerr << "INT\t" << m << ' ' << open << ' ' << close << '\n'; } // std::cerr << "CLOSE\t" << p[i].first << ' ' << p[i].second << '\t' << m << ' ' << open << ' ' << close << '\n'; return {m, open, close}; }; return n == 0 ? 0 : std::get<2>(rec(0)); } int DistanceSum(int n, int x[], int y[]) { return (foo(n, x, y) + foo(n, y, x)) % mod; }

Compilation message (stderr)

city.cpp: In lambda function:
city.cpp:28:12: warning: comparison of integer expressions of different signedness: 'u32' {aka 'unsigned int'} and 'int' [-Wsign-compare]
   28 |   while (j < n && p[j - 1].first == p[j].first && p[j - 1].second + 1 == p[j].second) ++j;
      |          ~~^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...