제출 #1128011

#제출 시각아이디문제언어결과실행 시간메모리
1128011Zero_OP운세 보기 2 (JOI14_fortune_telling2)C++17
100 / 100
599 ms49012 KiB
#include <bits/stdc++.h> using namespace std; #define rep(i, l, r) for(int i = (l); i < (r); ++i) #define sz(v) (int)v.size() #define dbg(x) "[" #x " = " << (x) << "]" #define all(v) begin(v), end(v) #define compact(v) v.erase(unique(all(v)), end(v)) #define file(name) if(fopen(name".inp", "r")){ freopen(name".inp", "r", stdin); freopen(name".out", "w", stdout); } template<typename T> bool minimize(T& a, const T& b){ if(a > b){ return a = b, true; } return false; } template<typename T> bool maximize(T& a, const T& b){ if(a < b){ return a = b, true; } return false; } mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); using ll = long long; using ld = long double; using ull = unsigned long long; using vi = vector<int>; using vl = vector<ll>; const int MAX = 2e5 + 5; int N, Q, A[MAX], B[MAX], T[MAX]; vector<int> st[MAX << 2]; template<typename T> void merge_sort(vector<T>& result, vector<T>& a, vector<T>& b){ int i = 0, j = 0; while(i < sz(a) || j < sz(b)){ if(i == sz(a)) result.push_back(b[j++]); else if(j == sz(b)) result.push_back(a[i++]); else if(a[i] < b[j]) result.push_back(a[i++]); else result.push_back(b[j++]); } } void build(int id, int l, int r){ if(l == r){ st[id] = {T[l]}; } else{ int mid = l + r >> 1; build(id << 1, l, mid); build(id << 1 | 1, mid + 1, r); merge_sort(st[id], st[id << 1], st[id << 1 | 1]); } } bool exist(int id, int lv, int rv){ return upper_bound(all(st[id]), rv) != lower_bound(all(st[id]), lv); } int find_last(int id, int l, int r, int lv, int rv){ if(l == r) return l; int mid = l + r >> 1; if(exist(id << 1 | 1, lv, rv)) return find_last(id << 1 | 1, mid + 1, r, lv, rv); else return find_last(id << 1, l, mid, lv, rv); } int find_last(int lv, int rv){ if(exist(1, lv, rv)) return find_last(1, 1, Q, lv, rv); else return -1; } int calc(int id, int lv){ return st[id].end() - lower_bound(all(st[id]), lv); } int count_bound(int id, int l, int r, int u, int v, int lv){ if(u <= l && r <= v){ return calc(id, lv); } int mid = l + r >> 1; if(u > mid) return count_bound(id << 1 | 1, mid + 1, r, u, v, lv); if(mid >= v) return count_bound(id << 1, l, mid, u, v, lv); return count_bound(id << 1, l, mid, u, v, lv) + count_bound(id << 1 | 1, mid + 1, r, u, v, lv); } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); file("task"); cin >> N >> Q; for(int i = 1; i <= N; ++i) cin >> A[i] >> B[i]; for(int i = 1; i <= Q; ++i) cin >> T[i]; build(1, 1, Q); ll ans = 0; for(int i = 1; i <= N; ++i){ if(A[i] == B[i]){ ans += A[i]; continue; } if(A[i] < B[i]){ int last = find_last(A[i], B[i] - 1); if(last == -1){ int both = count_bound(1, 1, Q, 1, Q, B[i]); //still at A[i] if(both & 1){ ans += B[i]; } else{ ans += A[i]; } } else{ int both = count_bound(1, 1, Q, last, Q, B[i]); //at B[i] now if(both & 1){ ans += A[i]; } else{ ans += B[i]; } } } else{ swap(A[i], B[i]); int last = find_last(A[i], B[i] - 1); if(last == -1){ int both = count_bound(1, 1, Q, 1, Q, B[i]); //currently at B[i] if(both & 1){ ans += A[i]; } else{ ans += B[i]; } } else{ int both = count_bound(1, 1, Q, last, Q, B[i]); //still at B[i] if(both & 1){ ans += A[i]; } else{ ans += B[i]; } } } } cout << ans << '\n'; return 0; }

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

fortune_telling2.cpp: In function 'int main()':
fortune_telling2.cpp:10:55: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   10 | #define file(name) if(fopen(name".inp", "r")){ freopen(name".inp", "r", stdin); freopen(name".out", "w", stdout); }
      |                                                ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
fortune_telling2.cpp:98:5: note: in expansion of macro 'file'
   98 |     file("task");
      |     ^~~~
fortune_telling2.cpp:10:88: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   10 | #define file(name) if(fopen(name".inp", "r")){ freopen(name".inp", "r", stdin); freopen(name".out", "w", stdout); }
      |                                                                                 ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
fortune_telling2.cpp:98:5: note: in expansion of macro 'file'
   98 |     file("task");
      |     ^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...