Submission #1161036

#TimeUsernameProblemLanguageResultExecution timeMemory
1161036nhphucFortune Telling 2 (JOI14_fortune_telling2)C++20
100 / 100
324 ms27128 KiB
#include <bits/stdc++.h> using namespace std; const int N = 200200; const int T = 600000; int n, k, a[N], b[N], c[N], t[T * 4 + 1007], ts[T * 4 + 1007]; vector<int> ns; int pts (int x){ return lower_bound(ns.begin(), ns.end(), x) - ns.begin() + 1; } void upd (int id, int l, int r, int k, int x){ if (l == r){ t[id] = x; return; } int m = l + r >> 1; if (k <= m){ upd(id * 2, l, m, k, x); } else { upd(id * 2 + 1, m + 1, r, k, x); } t[id] = max(t[id * 2], t[id * 2 + 1]); return; } int get (int id, int l, int r, int u, int v){ if (l > v || r < u){ return 0; } if (l >= u && r <= v){ return t[id]; } int m = l + r >> 1; return max(get(id * 2, l, m, u, v), get(id * 2 + 1, m + 1, r, u, v)); } void upds (int id, int l, int r, int k){ if (l == r){ ++ts[id]; return; } int m = l + r >> 1; if (k <= m){ upds(id * 2, l, m, k); } else { upds(id * 2 + 1, m + 1, r, k); } ts[id] = ts[id * 2] + ts[id * 2 + 1]; return; } int gets (int id, int l, int r, int u, int v){ if (l > v || r < u){ return 0; } if (l >= u && r <= v){ return ts[id]; } int m = l + r >> 1; return gets(id * 2, l, m, u, v) + gets(id * 2 + 1, m + 1, r, u, v); } int32_t main (){ ios::sync_with_stdio(false); cin.tie(nullptr); if (fopen ("test.inp", "r")){ freopen ("test.inp", "r", stdin); freopen ("test.out", "w", stdout); } cin >> n >> k; for (int i = 1; i <= n; ++i){ cin >> a[i] >> b[i]; ns.push_back(a[i]); ns.push_back(b[i]); } for (int i = 1; i <= k; ++i){ cin >> c[i]; ns.push_back(c[i]); } sort(ns.begin(), ns.end()); ns.erase(unique(ns.begin(), ns.end()), ns.end()); for (int i = 1; i <= n; ++i){ a[i] = pts(a[i]); b[i] = pts(b[i]); } for (int i = 1; i <= k; ++i){ c[i] = pts(c[i]); upd(1, 1, T, c[i], i); } vector<tuple<int, int, int>> events; for (int i = 1; i <= n; ++i){ int x = min(a[i], b[i]), y = max(a[i], b[i]); int f = get(1, 1, T, x, y - 1); if (f != 0){ events.push_back({f, y, x}); } else { events.push_back({f, a[i], b[i]}); } } sort(events.begin(), events.end(), greater<tuple<int, int, int>>()); int id = k + 1; long long ans = 0; for (auto [f, x, y] : events){ while (id > f && id > 1){ upds(1, 1, T, c[--id]); } int flip = gets(1, 1, T, max(x, y), T); ans += 1ll * ns[(flip % 2 == 0 ? x : y) - 1]; } cout << ans << "\n"; }

Compilation message (stderr)

fortune_telling2.cpp: In function 'int32_t main()':
fortune_telling2.cpp:69:17: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   69 |         freopen ("test.inp", "r", stdin);
      |         ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
fortune_telling2.cpp:70:17: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   70 |         freopen ("test.out", "w", stdout);
      |         ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...