#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
int main(){
cin.sync_with_stdio(0); cin.tie(0);
//int next[2][1000][20]; // next stop of level <= j, you are <= j+1 (taking trains of j+1)
//int idx[1000][21];
int next[2][100000][101]; // next stop of level <= j, you are <= j+1 (taking trains of j+1)
int idx[100000][101];
int n, k, q;
cin >> n >> k >> q;
vector<int> level(n);
for(int i = 0; i < n; i++){
cin >> level[i];
level[i] = k - level[i];
}
vector<pair<int,int> > queries;
for(int i = 0; i < q; i++){
int a, b;
cin >> a >> b;
a--; b--;
queries.push_back({a,b});
}
for(int j = 0; j <= k; j++){
int cur = 0;
for(int i = 0; i < n; i++){
if(level[i] <= j){
idx[i][j] = cur;
cur++;
}
}
}
for(int j = 0; j < k; j++){
int prev = 0;
for(int i = 0; i < n; i++){
if(level[i] > j+1) continue;
if(level[i] <= j){
prev = i;
}
next[0][i][j] = prev;
}
prev = n-1;
for(int i = n-1; i >= 0; i--){
if(level[i] > j+1) continue;
if(level[i] <= j){
prev = i;
}
next[1][i][j] = prev;
}
}
for(int zz = 0; zz < queries.size(); zz++){
pair<int,int> stuff[2][2]; // person, then side
stuff[0][0] = stuff[0][1] = {queries[zz].first, 0};
stuff[1][0] = stuff[1][1] = {queries[zz].second, 0};
int ans = 1000000000;
for(int j = k-1; j >= 0; j--){
// go to level j
for(int p = 0; p < 2; p++){
pair<int,int> newstuff[2];
newstuff[0] = make_pair(next[0][stuff[p][0].first ][j], 1000000000);
newstuff[1] = make_pair(next[1][stuff[p][1].first ][j], 1000000000);
for(int i = 0; i < 2; i++){
pair<int,int> x = stuff[p][i];
// go left from x, go right from x;
int loc = x.first;
int dist = x.second;
for(int dir = 0; dir < 2; dir++){
int newloc = next[dir][loc][j];
int newdist = dist + abs(idx[ loc ][j+1] - idx[ newloc ][j+1]);
for(int qq = 0; qq < 2; qq++){
if(newstuff[qq].first == newloc){
newstuff[qq].second = min(newstuff[qq].second, newdist);
}
}
}
}
stuff[p][0] = newstuff[0];
stuff[p][1] = newstuff[1];
}
// find ans
for(int i0 = 0; i0 < 2; i0++){
pair<int,int> x0 = stuff[0][i0];
for(int i1 = 0; i1 < 2; i1++){
pair<int,int> x1 = stuff[1][i1];
ans = min(ans, x0.second + x1.second + abs(idx[x0.first][j] - idx[x1.first][j]));
}
}
}
cout << ans - 1 << '\n';
}
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
5 ms |
512 KB |
Output is correct |
2 |
Correct |
5 ms |
512 KB |
Output is correct |
3 |
Correct |
5 ms |
512 KB |
Output is correct |
4 |
Correct |
5 ms |
512 KB |
Output is correct |
5 |
Correct |
5 ms |
512 KB |
Output is correct |
6 |
Correct |
5 ms |
512 KB |
Output is correct |
7 |
Correct |
6 ms |
512 KB |
Output is correct |
8 |
Correct |
5 ms |
512 KB |
Output is correct |
9 |
Correct |
5 ms |
384 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
16 ms |
1536 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
313 ms |
122096 KB |
Output is correct |
2 |
Correct |
248 ms |
122096 KB |
Output is correct |
3 |
Correct |
315 ms |
122168 KB |
Output is correct |
4 |
Correct |
305 ms |
122224 KB |
Output is correct |
5 |
Correct |
332 ms |
122092 KB |
Output is correct |
6 |
Correct |
335 ms |
122096 KB |
Output is correct |
7 |
Correct |
349 ms |
122096 KB |
Output is correct |
8 |
Correct |
143 ms |
122096 KB |
Output is correct |
9 |
Correct |
194 ms |
122224 KB |
Output is correct |
10 |
Correct |
214 ms |
122224 KB |
Output is correct |
11 |
Correct |
218 ms |
122220 KB |
Output is correct |
12 |
Correct |
218 ms |
122220 KB |
Output is correct |
13 |
Correct |
213 ms |
122352 KB |
Output is correct |
14 |
Correct |
229 ms |
122220 KB |
Output is correct |
15 |
Correct |
255 ms |
122096 KB |
Output is correct |
16 |
Correct |
321 ms |
122100 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Execution timed out |
2097 ms |
42992 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |