답안 #280386

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
280386 2020-08-22T17:09:55 Z super_j6 케이크 (CEOI14_cake) C++14
100 / 100
1094 ms 24056 KB
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string.h>
#include <set>
using namespace std;
#define endl '\n'
#define ll long long
#define pi pair<int, int>
#define pii pair<pi, int>
#define f first
#define s second
 
const int mxn = 250002, m = 14;
int n, k, q;
int a[mxn];
int f[m], b[m];
set<pii> s;
 
int ff(int x){
	return find(f, f + m, x) - f;
}
 
void add(int x, int y, int v){
	auto it = s.lower_bound({{y + 1, 0}, 0});
	if(it->f.s <= y) s.insert({{it->f.f, y + 1}, it->s - (y < k) * (y + 1 - it->f.s)}), it = s.erase(it);
	while((--it)->f.s >= x) it = s.erase(it);
	if(it->f.f >= x) s.insert({{x - 1, it->f.s}, it->s - (x > k) * (it->f.f + 1 - x)}), it = s.erase(it);
	s.insert({{y, x}, v});
}
 
int qry(int x){
	pii p = *s.lower_bound({{x, 0}, 0});
	return p.s + (x < k ? p.f.s - x : x - p.f.f);
}
 
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	
	cin >> n >> k;
	

	for(int i = 1; i <= n; i++){
		cin >> a[i];
		f[m - 1] = i;
		for(int j = m - 2; ~-j; j--) if(a[f[j]] < a[f[j + 1]]) swap(f[j], f[j + 1]);
	} 
	
	a[0] = a[n + 1] = f[1] = n + 1;
	s.insert({{0, 0}, n}), s.insert({{k, k}, 0}), s.insert({{n + 1, n + 1}, n});
	
	for(int i = 1, l = k - 1, r = k + 1; i < n; i++){
		if(a[l] < a[r]) add(l, l, i), l--;
		else add(r, r, i), r++;
	}
	
	cin >> q;
	
	int cnt = 0;
	while(q--){
		char t;
		cin >> t;
		if(t == 'F'){
			int x;
			cin >> x;
			cout << qry(x) << endl;
		}else{
			int x, y;
			cin >> x >> y;
			y++;
			
			for(int i = ff(x); i < m - 1; i++) swap(f[i], f[i + 1]);
			
			f[m - 1] = x;
			for(int i = m - 2; i >= y; i--) swap(f[i], f[i + 1]);
			
			memcpy(b, f, sizeof(b));
			b[m - 1] = !count(f, f + m - 2, k) * k;
			b[m - 2] = x + ((x < k) - (x > k)) * (qry(x + (x < k) - (x > k)) + 2);
			b[m - 2] *= !count(f, f + m - 2, b[m - 2]);
			sort(b, b + m);
			
			for(int l = find(b, b + m, k) - b, r = l, i = b[++r] - b[--l] - 2; i < n - 1;){
				if(ff(b[l]) > ff(b[r])) add(b[l - 1] + 1, b[l], i += b[l] - b[l - 1]), l--;
				else add(b[r], b[r + 1] - 1, i += b[r + 1] - b[r]), r++;
			}
		}
	}
	
	return 0;
}

Compilation message

cake.cpp: In function 'int main()':
cake.cpp:60:6: warning: unused variable 'cnt' [-Wunused-variable]
   60 |  int cnt = 0;
      |      ^~~
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 384 KB Output is correct
2 Correct 1 ms 384 KB Output is correct
3 Correct 1 ms 384 KB Output is correct
4 Correct 8 ms 524 KB Output is correct
5 Correct 18 ms 1152 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1037 ms 3604 KB Output is correct
2 Correct 809 ms 3624 KB Output is correct
3 Correct 1022 ms 3748 KB Output is correct
4 Correct 838 ms 3744 KB Output is correct
5 Correct 1094 ms 4600 KB Output is correct
6 Correct 948 ms 4648 KB Output is correct
7 Correct 1052 ms 4656 KB Output is correct
8 Correct 842 ms 4728 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 83 ms 8952 KB Output is correct
2 Correct 79 ms 8824 KB Output is correct
3 Correct 76 ms 8824 KB Output is correct
4 Correct 1 ms 384 KB Output is correct
5 Correct 168 ms 20088 KB Output is correct
6 Correct 172 ms 20060 KB Output is correct
7 Correct 164 ms 19832 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 68 ms 1016 KB Output is correct
2 Correct 68 ms 1144 KB Output is correct
3 Correct 133 ms 4856 KB Output is correct
4 Correct 126 ms 4856 KB Output is correct
5 Correct 204 ms 1912 KB Output is correct
6 Correct 231 ms 6904 KB Output is correct
7 Correct 259 ms 3064 KB Output is correct
8 Correct 490 ms 9592 KB Output is correct
9 Correct 813 ms 24056 KB Output is correct
10 Correct 659 ms 5240 KB Output is correct
11 Correct 650 ms 7288 KB Output is correct
12 Correct 808 ms 18808 KB Output is correct
13 Correct 788 ms 22904 KB Output is correct