Submission #546045

#TimeUsernameProblemLanguageResultExecution timeMemory
546045blueCake (CEOI14_cake)C++17
15 / 100
2097 ms26804 KiB
#include <iostream> #include <vector> #include <set> #include <algorithm> using namespace std; using vi = vector<int>; using vvi = vector<vi>; using pii = pair<int, int>; #define sz(x) int(x.size()) int N; vi d; struct segtree { int Z; vi l, r, mxv; void build(int i, int L, int R) { // cerr << "build " << i << ' ' << L << ' ' << R << '\n'; l[i] = L; r[i] = R; if(l[i] == r[i]) { // cerr << "case 1\n"; mxv[i] = d[l[i]]; } else { // cerr << "case 2\n"; build(2*i, L, (L+R)/2); build(2*i+1, (L+R)/2+1, R); mxv[i] = max(mxv[2*i], mxv[2*i+1]); } // cerr << i << " -> " << l[i] << ' ' << r[i] << " : " << mxv[i] << '\n'; // cerr << "exit\n"; } segtree() { Z = 4*(1+N+1); l = r = mxv = vi(1 + Z); build(1, 0, N+1); } void update(int i, int p, int v) { if(l[i] == r[i]) mxv[i] = v; else { if(p <= (l[i] + r[i])/2) update(2*i, p, v); else update(2*i+1, p, v); mxv[i] = max(mxv[2*i], mxv[2*i+1]); } } int rangemax(int i, int L, int R) { // cerr << "rangemax : " << i << ' ' << l[i] << ' ' << r[i] << " <> " << L << ' ' << R << '\n'; if(R < l[i] || r[i] < L) return -1'000'000'000; else if(L <= l[i] && r[i] <= R) return mxv[i]; else return max(rangemax(2*i, L, R), rangemax(2*i+1, L, R)); } int locatenextgeq(int p, int v) { int i = 1; while(l[i] != r[i]) { if(p <= (l[i] + r[i])/2) i = 2*i; else i = 2*i + 1; } while(!(l[i] != r[i] && mxv[2*i+1] >= v)) i /= 2; i = 2*i + 1; while(l[i] != r[i]) { if(mxv[2*i] >= v) i = 2*i; else i = 2*i + 1; } return l[i]; } int locateprevgeq(int p, int v) { int i = 1; while(l[i] != r[i]) { if(p <= (l[i] + r[i])/2) i = 2*i; else i = 2*i + 1; } // cerr << "positional i = " << i << '\n'; while(!(l[i] != r[i] && mxv[2*i] >= v)) { i /= 2; // cerr << i << ' ' << l[i] << ' ' << r[i] << " : " << mxv[2*i] << '\n'; if(i == 0) while(1); } i = 2*i; // cerr << "resulting i = " << i << '\n'; while(l[i] != r[i]) { if(mxv[2*i + 1] >= v) i = 2*i + 1; else i = 2*i; } return l[i]; } }; int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); int a; cin >> N >> a; d = vi(1+N+1); for(int i = 1; i <= N; i++) cin >> d[i]; d[0] = d[N+1] = 1'000'000'000; int ld = N+1; segtree S; // cerr << "done\n"; set<pii> elements; for(int i = 1; i <= N; i++) elements.insert({d[i], i}); vi delpos(1+N); for(int i = 1; i <= N; i++) delpos[d[i]] = i; int Q; cin >> Q; for(int j = 1; j <= Q; j++) { char c; cin >> c; if(c == 'E') { int i, e; cin >> i >> e; while(delpos[N-e+1] != i) { int di = d[i]; int pi = delpos[d[i] + 1]; int dpi = d[pi]; swap(d[i], d[pi]); swap(delpos[di], delpos[dpi]); } } else { int b; cin >> b; vi nd(1+N+1); for(int i = 1; i <= N; i++) { nd[delpos[i]] = i; } nd[0] = nd[N+1] = 1'000'000'000; int res = 0; int x = a,y = a; while(!(x <= b && b <= y)) { if(nd[x-1] < nd[y+1]) { x -= 1; } else { y += 1; } res++; } cout << res << '\n'; } } }

Compilation message (stderr)

cake.cpp: In function 'int main()':
cake.cpp:146:6: warning: unused variable 'ld' [-Wunused-variable]
  146 |  int ld = N+1;
      |      ^~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...