제출 #1123450

#제출 시각아이디문제언어결과실행 시간메모리
1123450kh0i케이크 (CEOI14_cake)C++17
100 / 100
435 ms10068 KiB
#include "bits/stdc++.h" using namespace std; #ifdef LOCAL #include "debug.h" #else #define debug(...) #endif using ll = long long; using pii = pair<int, int>; #define F first #define S second #define sz(x) (int)((x).size()) #define all(x) (x).begin(), (x).end() mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count()); ll get_rand(ll l, ll r) { assert(l <= r); return uniform_int_distribution<ll> (l, r)(rng); } const int N = 250003; int n, q, d[N], pos[N]; vector<pii> val; int a; namespace ST{ int st[N << 2]; void _update(int id, int l, int r, int pos, int val){ if(l == r){ st[id] = val; return; } int mid = (l + r) >> 1; if(pos <= mid) _update(id << 1, l, mid, pos, val); else _update(id << 1 | 1, mid + 1, r, pos, val); st[id] = max(st[id << 1], st[id << 1 | 1]); } int _get(int id, int l, int r, int tl, int tr){ if(l > tr or tl > r) return 0; if(tl <= l and r <= tr) return st[id]; int mid = (l + r) >> 1; return max(_get(id << 1, l, mid, tl, tr), _get(id << 1 | 1, mid + 1, r, tl, tr)); } int _walkl(int id, int l, int r, int tl, int tr, int val){ if(l > tr or tl > r) return -1; if(st[id] < val) return -1; if(l == r) return l; int mid = (l + r) >> 1; int res = _walkl(id << 1, l, mid, tl, tr, val); if(res != -1) return res; return _walkl(id << 1 | 1, mid + 1, r, tl, tr, val); } int _walkr(int id, int l, int r, int tl, int tr, int val){ if(l > tr or tl > r) return -1; if(st[id] < val) return -1; if(l == r) return l; int mid = (l + r) >> 1; int res = _walkr(id << 1 | 1, mid + 1, r, tl, tr, val); if(res != -1) return res; return _walkr(id << 1, l, mid, tl, tr, val); } void update(int pos, int val){ debug(pos, val); _update(1, 1, n, pos, val); } int get(int l, int r){ return _get(1, 1, n, l, r); } int walkl(int l, int r, int val){ return _walkl(1, 1, n, l, r, val); } int walkr(int l, int r, int val){ return _walkr(1, 1, n, l, r, val); } } void solve(){ cin >> n >> a; for(int i = 1; i <= n; ++i){ cin >> d[i]; pos[d[i]] = i; } for(int i = 1; i <= n; ++i){ val.emplace_back(i, pos[i]); ST::update(i, d[i]); } cin >> q; while(q--){ char c; cin >> c; if(c == 'E'){ int i, e; cin >> i >> e; set<int> saved; vector<pii> nx; while(sz(nx) + 1 < e){ if(!saved.count(val.back().S)){ nx.push_back(val.back()); saved.insert(val.back().S); } val.pop_back(); } ST::update(i, val.back().F + 1); val.emplace_back(val.back().F + 1, i); while(!nx.empty()){ ST::update(nx.back().S, val.back().F + 1); val.emplace_back(val.back().F + 1, nx.back().S); nx.pop_back(); } } else{ int b; cin >> b; if(b == a){ cout << 0 << '\n'; continue; } if(a == 1 or a == n){ cout << abs(a - b) << '\n'; continue; } if(b < a){ int mx = ST::get(b, a - 1); int rv = ST::walkl(a + 1, n, mx); if(rv == -1) rv = n + 1; cout << rv - b - 1 << '\n'; } else{ int mx = ST::get(a + 1, b); int lv = ST::walkr(1, a - 1, mx); if(lv == -1) lv = 0; cout << b - lv - 1 << '\n'; } } } } int32_t main() { cin.tie(nullptr)->sync_with_stdio(0); #define task "troll" if(fopen(task".inp", "r")){ freopen(task".inp", "r", stdin); freopen(task".out", "w", stdout); } int test = 1; // cin >> test; for(int i = 1; i <= test; ++i){ // cout << "Case #" << i << ": "; solve(); } #ifdef LOCAL cerr << "\n[Time]: " << 1000.0 * clock() / CLOCKS_PER_SEC << " ms.\n"; #endif return 0; }

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

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