제출 #1178971

#제출 시각아이디문제언어결과실행 시간메모리
1178971CodeLakVNFortune Telling 2 (JOI14_fortune_telling2)C++20
100 / 100
276 ms23340 KiB
#include <bits/stdc++.h> using namespace std; #define task "14O_fortune_telling2" #define no "NO" #define yes "YES" #define F first #define S second #define vec vector #define _mp make_pair #define ii pair<int, int> #define sz(x) (int)x.size() #define all(x) x.begin(), x.end() #define evoid(val) return void(std::cout << val) #define FOR(i, a, b) for(int i = (a); i <= (b); ++i) #define FOD(i, b, a) for(int i = (b); i >= (a); --i) const int MAX_N = (int)2e5 + 5; int numCard, numQuery; vector<ii> cards; vector<int> query; struct FenwickTree { vector<int> bit; int n; FenwickTree(int _n) { n = _n; bit.resize(n + 1); } void update(int idx, int val) { for (; idx <= n; idx += (idx & -idx)) bit[idx] += val; } int get(int idx) { int res = 0; for (; idx > 0; idx -= (idx & -idx)) res += bit[idx]; return res; } int get(int l, int r) { return get(r) - get(l - 1); } }; struct SegmentTree { vector<int> it; int n; SegmentTree(int _n) { n = _n; it.resize(4 * n + 1); } void update(int id, int l, int r, int pos, int val) { if (l == r) { it[id] = max(it[id], val); return; } int mid = (l + r) >> 1; if (pos <= mid) update(2 * id, l, mid, pos, val); else update(2 * id + 1, mid + 1, r, pos, val); it[id] = max(it[2 * id], it[2 * id + 1]); } int get(int id, int l, int r, int u, int v) { if (u > v) return 0; if (l > v || r < u) return 0; if (l >= u && r <= v) return it[id]; int mid = (l + r) >> 1; return max(get(id << 1, l, mid, u, v), get(id << 1 | 1, mid + 1, r, u, v)); } }; vector<int> bucket[MAX_N]; void solve() { cin >> numCard >> numQuery; cards.resize(numCard + 1); query.resize(numQuery + 1); FOR(i, 1, numCard) cin >> cards[i].F >> cards[i].S; FOR(i, 1, numQuery) cin >> query[i]; vector<int> com = query; for (ii c : cards) com.push_back(c.F), com.push_back(c.S); sort(com.begin(), com.end()); com.erase(unique(com.begin(), com.end()), com.end()); int m = (int)com.size(); SegmentTree IT(m); FOR(i, 1, numQuery) { query[i] = lower_bound(all(com), query[i]) - com.begin(); IT.update(1, 1, m, query[i], i); } FOR(i, 1, numCard) { int l = min(cards[i].F, cards[i].S); l = lower_bound(all(com), l) - com.begin(); int r = max(cards[i].F, cards[i].S); r = lower_bound(all(com), r) - com.begin(); int x = IT.get(1, 1, m, l, r - 1); bucket[x].push_back(i); } FenwickTree BIT(m); FOD(i, numQuery, 0) { // cout << "i = " << i << "\n"; for (int id : bucket[i]) { int r = lower_bound(all(com), max(cards[id].F, cards[id].S)) - com.begin(); int cnt = BIT.get(r, m); // cout << id << ": " << cards[id].F << " " << cards[id].S << ": " << cnt << "\n"; if (i > 0 && cards[id].F < cards[id].S) swap(cards[id].F, cards[id].S); if (cnt & 1) swap(cards[id].F, cards[id].S); } if (i == 0) break; BIT.update(query[i], 1); } long long ans = 0; FOR(i, 1, numCard) ans += cards[i].F; cout << ans << "\n"; } int32_t main() { if (fopen(task".inp", "r")) { freopen(task".inp", "r", stdin); freopen(task".out", "w", stdout); } ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); bool multitest = 0; int numTest = 1; if (multitest) cin >> numTest; while (numTest--) { solve(); } return 0; } /* Lak lu theo dieu nhac!!!! */

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

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