제출 #286803

#제출 시각아이디문제언어결과실행 시간메모리
286803fishy15케이크 (CEOI14_cake)C++14
0 / 100
2083 ms5368 KiB
#include <iostream> #include <iomanip> #include <fstream> #include <vector> #include <array> #include <algorithm> #include <utility> #include <map> #include <queue> #include <set> #include <cmath> #include <cstdio> #include <cstring> #define ll long long #define ld long double #define eps 1e-8 #define MOD 1000000007 #define INF 0x3f3f3f3f #define INFLL 0x3f3f3f3f3f3f3f3f // change if necessary #define MAXN 250010 using namespace std; int n, a; int q; int st[4 * MAXN]; int nums[MAXN]; int sz; vector<int> top; int curmax; void build(int v, int l, int r) { if (l == r) { st[v] = nums[l]; } else { int m = (l + r) / 2; build(2 * v, l, m); build(2 * v + 1, m + 1, r); st[v] = max(st[2 * v], st[2 * v + 1]); } } void upd(int v, int l, int r, int x, int y) { if (l == r) { st[v] = y; nums[x] = y; } else { int m = (l + r) / 2; if (x <= m) { upd(2 * v, l, m, x, y); } else { upd(2 * v + 1, m + 1, r, x, y); } st[v] = max(st[2 * v], st[2 * v + 1]); } } int qry_max(int v, int l, int r, int x, int y) { if (x <= l && r <= y) { return st[v]; } else if (y < l || x > r) { return 0; } else { int m = (l + r) / 2; return max(qry_max(2 * v, l, m, x, y), qry_max(2 * v + 1, m + 1, r, x, y)); } } int qry_left(int mm) { int l = 0; int r = a; int ans = -1; while (l <= r) { int m = (l + r) / 2; int v = qry_max(1, 0, n - 1, m, a); if (v <= mm) { ans = m; r = m - 1; } else { l = m + 1; } } return ans; } int qry_right(int mm) { int l = a; int r = n - 1; int ans = -1; while (l <= r) { int m = (l + r) / 2; int v = qry_max(1, 0, n - 1, a, m); if (v <= mm) { ans = m; l = m + 1; } else { r = m - 1; } } return ans; } int main() { cin.tie(0)->sync_with_stdio(0); cin >> n >> a; a--; curmax = n; for (int i = 0; i < n; i++) { cin >> nums[i]; } sz = min(n, 10); top.resize(sz); for (int i = 0; i < n; i++) { if (nums[i] > n - sz) { top[n - nums[i]] = i; } } build(1, 0, n - 1); cin >> q; while (q--) { char t; cin >> t; if (t == 'F') { int x; cin >> x; x--; if (x < a) { int ans = a - x; int mm = qry_max(1, 0, n - 1, x, a); ans += qry_right(mm) - a; cout << ans << '\n'; } else if (x > a) { int ans = x - a; int mm = qry_max(1, 0, n - 1, a, x); ans += a - qry_left(mm); cout << ans << '\n'; } else { cout << "0\n"; } } else { int i, e; cin >> i >> e; i--; e--; auto it = find(top.begin(), top.end(), i); if (it != top.end()) { top.erase(it); } top.insert(top.begin() + e, i); if (top.size() > sz) top.pop_back(); for (int j = 1; j <= sz; j++) { upd(1, 0, n - 1, top[sz - j], curmax + j); } curmax += sz; } } return 0; }

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

cake.cpp: In function 'int main()':
cake.cpp:157:28: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  157 |             if (top.size() > sz) top.pop_back();
      |                 ~~~~~~~~~~~^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...