제출 #372911

#제출 시각아이디문제언어결과실행 시간메모리
372911Ahoora운세 보기 2 (JOI14_fortune_telling2)C++14
100 / 100
558 ms58076 KiB
#include<bits/stdc++.h> using namespace std; const int N = 3 * 2 * 1000 * 100 + 10, LG = 20; int n, k, a[N], b[N], t[N], mn[N], sz, seg[N << 2], fen[N], fl[N]; vector<int> add[N]; vector<pair<int, int>> query[N]; inline void build(int l = 0, int r = sz, int id = 1) { if (l + 1 == r) { seg[id] = mn[l]; return; } int mid = l + r >> 1; build(l, mid, id << 1), build(mid, r, id << 1 | 1); seg[id] = min(seg[id << 1], seg[id << 1 | 1]); } inline int get(int s, int e, int l = 0, int r = sz, int id = 1) { if (s <= l && e >= r) return seg[id]; if (s >= r || e <= l) return k; int mid = l + r >> 1; return min(get(s, e, l, mid, id << 1), get(s, e, mid, r, id << 1 | 1)); } inline void upd(int x) { for (++x; x < N; x += x & -x) fen[x]++; } inline int GET(int x) { int res = 0; for (; x; x -= x & -x) res += fen[x]; return res; } inline int inp() { int res = 0; char c = '0'; while (c >= '0' && c <= '9') { ((res *= 10) += c - '0'); c = getchar(); } return res; } int main() { ios::sync_with_stdio(false), cin.tie(0), cout.tie(0); n = inp(), k = inp(); vector<int> all; for (int i = 0; i < n; i++) { a[i] = inp(), b[i] = inp(); for (auto x: {a[i], b[i]}) all.push_back(x); } for (int i = 0; i < k; i++) t[i] = inp(), all.push_back(t[i]); sort(all.begin(), all.end()); all.resize(unique(all.begin(), all.end()) - all.begin()); for (int i = 0; i < n; i++) for (auto x: {&a[i], &b[i]}) *x = lower_bound(all.begin(), all.end(), *x) - all.begin(); for (int i = 0; i < k; i++) t[i] = lower_bound(all.begin(), all.end(), t[i]) - all.begin(); reverse(t, t + k); sz = (int)(all.size()); for (int i = 0; i < sz; i++) mn[i] = k; for (int i = 0; i < k; i++) mn[t[i]] = min(mn[t[i]], i); build(); for (int i = 0; i < k; i++) add[t[i]].push_back(i); for (int i = 0; i < n; i++) { if (a[i] > b[i]) swap(a[i], b[i]), fl[i]++; int ind = get(a[i], b[i]); query[b[i]].push_back({i, ind}); } long long ans = 0; for (int i = N - 1; i >= 0; i--) { for (auto it: add[i]) upd(it); for (auto it: query[i]) { int ind = it.second, i = it.first; int res = GET(ind); if (ind == k) { fl[i] += res; } else { fl[i] = 0; fl[i] += res; swap(a[i], b[i]); } ans += (fl[i] & 1? all[b[i]]: all[a[i]]); } } printf("%lld\n", ans); return 0; }

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

fortune_telling2.cpp: In function 'void build(int, int, int)':
fortune_telling2.cpp:14:14: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   14 |  int mid = l + r >> 1;
      |            ~~^~~
fortune_telling2.cpp: In function 'int get(int, int, int, int, int)':
fortune_telling2.cpp:24:14: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   24 |  int mid = l + r >> 1;
      |            ~~^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...