# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
101553 | dantoh000 | 케이크 (CEOI14_cake) | C++14 | 681 ms | 8184 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
typedef pair<int,int> ii;
typedef pair<int,ii> iii;
int main(){
int n,a;
scanf("%d%d",&n,&a);
a--;
ii d[n];
for (int i = 0; i < n; i++) {
scanf("%d",&d[i].first);
d[i].second = i;
}
int q;
scanf("%d",&q);
int num0 = 0, num1 = 0;
iii qu[q];
for (int i = 0; i < q; i++){
char x;
scanf(" %c",&x);
qu[i].first = x != 'E';
if (x == 'E'){
num0++;
scanf("%d%d",&qu[i].second.first,&qu[i].second.second);
qu[i].second.first--;
}
else{
num1++;
scanf("%d",&qu[i].second.first);
qu[i].second.first--;
}
}
if (n <= 10000 && q <= 10000){
int r[n];
sort(d,d+n,greater<ii>());
for (int i = 0; i < n; i++) r[d[i].second] = i;
int ans = 0;
priority_queue<ii> pq;
int vis[n]; memset(vis,0,sizeof(vis));
for (int i = 0; i < q; i++){
if (qu[i].first == 0){
int k = qu[i].second.first, e = qu[i].second.second;
for (int i = 0; i < n; i++){
if (e <= r[i] && r[i] <= r[k]) r[i]++;
}
r[k] = e;
}
else{
int b = qu[i].second.first;
memset(vis,0,sizeof(vis));
ans = 0;
pq.push(ii(r[a],a));
while (pq.size()){
ii cur = pq.top(); pq.pop();
int t = cur.second;
if (t == b) break;
ans++;
vis[t] = 1;
if (t-1 >= 0 && !vis[t-1]) {
pq.push(ii(r[t-1],t-1));
}
if (t+1 < n && !vis[t+1]) {
pq.push(ii(r[t+1],t+1));
}
}
printf("%d\n",ans);
while (pq.size()) pq.pop();
}
}
}
else if (num0 <= 100){
int r[n];
sort(d,d+n,greater<ii>());
for (int i = 0; i < n; i++){
r[d[i].second] = i;
}
int ans[n]; memset(ans,0,sizeof(ans));
int vis[n]; memset(vis,0,sizeof(vis));
int ct = 0;
priority_queue<ii> pq; pq.push(ii(r[a],a));
while (pq.size()){
ii cur = pq.top(); pq.pop();
int t = cur.second;
ans[t] = ct++;
vis[t] = 1;
if (t-1 >= 0 && !vis[t-1]) {
pq.push(ii(r[t-1],t-1));
}
if (t+1 < n && !vis[t+1]) {
pq.push(ii(r[t+1],t+1));
}
}
for (int i = 0; i < q; i++){
if (qu[i].first == 0){
int k = qu[i].second.first, e = qu[i].second.second;
for (int i = 0; i < n; i++){
if (e <= r[i] && r[i] <= r[k]) r[i]++;
}
r[k] = e;
memset(vis,0,sizeof(vis));
memset(ans,0,sizeof(ans));
ct = 0;
pq.push(ii(r[a],a));
while (pq.size()){
ii cur = pq.top(); pq.pop();
int t = cur.second;
ans[t] = ct++;
vis[t] = 1;
if (t-1 >= 0 && !vis[t-1]) {
pq.push(ii(r[t-1],t-1));
}
if (t+1 < n && !vis[t+1]) {
pq.push(ii(r[t+1],t+1));
}
}
}
else{
int b = qu[i].second.first;
printf("%d\n",ans[b]);
}
}
}
}
컴파일 시 표준 에러 (stderr) 메시지
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |