답안 #799493

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
799493 2023-07-31T15:12:20 Z PixelCat 고대 책들 (IOI17_books) C++14
12 / 100
1 ms 340 KB
#include "books.h"

#ifdef NYAOWO
#include "grader.cpp"
#endif

#include <bits/stdc++.h>
#define For(i, a, b) for(int i = a; i <= b; i++)
#define Forr(i, a, b) for(int i = a; i >= b; i--)
#define F first
#define S second
#define all(x) x.begin(), x.end()
#define sz(x) ((int)x.size())
#define eb emplace_back
#define int LL
using namespace std;
using i32 = int32_t;
using LL = long long;
using pii = pair<int, int>;

const int MAXN = 1'000'000;
const int INF = 1e18;

LL minimum_walk(vector<i32> p, i32 s) {
    assert(s >= 0);
    int n = sz(p);

    int ans = 0;
    vector<int> cid(n, -1);
    vector<pii> range;
    For(i, 0, n - 1) if(p[i] != i && cid[i] == -1) {
        int cur = i;
        int l = n + 1;
        int r = -1;
        do {
            l = min(l, cur);
            r = max(r, cur);
            ans += abs(p[cur] - cur);
            cur = p[cur];
            cid[cur] = sz(range);
        } while(cur != i);
        range.eb(l, r);
    }
    if(sz(range) == 0) return 0;

    int L = 0, R = n - 1;
    while(cid[L] == -1) L++;
    while(cid[R] == -1) R--;
    L = min(L, (int)s);
    R = max(R, (int)s);
    cerr << L << " " << R << "\n";

    vector<int> nxtl(n), nxtr(n);
    nxtl[0] = -INF;
    For(i, 1, n - 1) {
        if(cid[i - 1] != -1) nxtl[i] = i - 1;
        else nxtl[i] = nxtl[i - 1];
    }
    nxtr[n - 1] = INF;
    Forr(i, n - 2, 0) {
        if(cid[i + 1] != -1) nxtr[i] = i + 1;
        else nxtr[i] = nxtr[i + 1];
    }

    int l = s, r = s;
    queue<int> que;
    if(cid[s] != -1) que.emplace(cid[s]);
    while(l > L || r < R) {
        pii rg;
        if(sz(que)) {
            int id = que.front(); que.pop();
            rg = range[id];
        } else {
            int l2, r2;

            int cl = 0;
            l2 = l; r2 = r;
            if(l2 == L) cl = INF;
            while(r2 == r && l2 != L) {
                cl += (l2 - nxtl[l2]) * 2;
                l2 = nxtl[l2];
                int l3 = range[cid[l2]].F;
                int r3 = range[cid[l2]].S;
                while(l2 > l3 || r2 < r3) {
                    if(r2 < r3) {
                        r2++;
                        break;
                    }
                    if(l2 > l3) {
                        l2--;
                        if(cid[l2] != -1) {
                            l3 = min(l3, range[cid[l2]].F);
                            r3 = max(r3, range[cid[l2]].S);
                        }
                    }
                }
            }

            int cr = 0;
            l2 = l; r2 = r;
            if(r2 == R) cr = INF;
            while(l2 == l && r2 != R) {
                cr += (nxtr[r2] - r2) * 2;
                r2 = nxtr[r2];
                int l3 = range[cid[r2]].F;
                int r3 = range[cid[r2]].S;
                while(l2 > l3 || r2 < r3) {
                    if(l2 > l3) {
                        l2--;
                        break;
                    }
                    if(r2 < r3) {
                        r2++;
                        if(cid[r2] != -1) {
                            l3 = min(l3, range[cid[r2]].F);
                            r3 = max(r3, range[cid[r2]].S);
                        }
                    }
                }
            }

            if(cl < cr) {
                ans += cl;
                rg = pii(nxtl[l], r);
            } else {
                ans += cr;
                rg = pii(l, nxtr[r]);
            }
        }
        while(l > rg.F) {
            l--;
            if(cid[l] != -1) que.emplace(cid[l]);
        }
        while(r < rg.S) {
            r++;
            if(cid[r] != -1) que.emplace(cid[r]);
        }
    }
    return ans;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB Output is correct
2 Correct 0 ms 212 KB Output is correct
3 Correct 0 ms 296 KB Output is correct
4 Correct 0 ms 212 KB Output is correct
5 Correct 1 ms 212 KB Output is correct
6 Correct 1 ms 212 KB Output is correct
7 Correct 1 ms 212 KB Output is correct
8 Correct 1 ms 212 KB Output is correct
9 Correct 1 ms 212 KB Output is correct
10 Correct 1 ms 212 KB Output is correct
11 Correct 1 ms 300 KB Output is correct
12 Correct 1 ms 300 KB Output is correct
13 Correct 1 ms 300 KB Output is correct
14 Correct 1 ms 300 KB Output is correct
15 Correct 1 ms 212 KB Output is correct
16 Correct 1 ms 212 KB Output is correct
17 Correct 0 ms 296 KB Output is correct
18 Correct 1 ms 212 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB Output is correct
2 Correct 0 ms 212 KB Output is correct
3 Correct 0 ms 296 KB Output is correct
4 Correct 0 ms 212 KB Output is correct
5 Correct 1 ms 212 KB Output is correct
6 Correct 1 ms 212 KB Output is correct
7 Correct 1 ms 212 KB Output is correct
8 Correct 1 ms 212 KB Output is correct
9 Correct 1 ms 212 KB Output is correct
10 Correct 1 ms 212 KB Output is correct
11 Correct 1 ms 300 KB Output is correct
12 Correct 1 ms 300 KB Output is correct
13 Correct 1 ms 300 KB Output is correct
14 Correct 1 ms 300 KB Output is correct
15 Correct 1 ms 212 KB Output is correct
16 Correct 1 ms 212 KB Output is correct
17 Correct 0 ms 296 KB Output is correct
18 Correct 1 ms 212 KB Output is correct
19 Correct 1 ms 300 KB Output is correct
20 Correct 1 ms 340 KB Output is correct
21 Correct 1 ms 212 KB Output is correct
22 Incorrect 1 ms 296 KB 3rd lines differ - on the 1st token, expected: '2082', found: '107088'
23 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB Output is correct
2 Correct 0 ms 212 KB Output is correct
3 Correct 0 ms 296 KB Output is correct
4 Correct 0 ms 212 KB Output is correct
5 Correct 1 ms 212 KB Output is correct
6 Correct 1 ms 212 KB Output is correct
7 Correct 1 ms 212 KB Output is correct
8 Correct 1 ms 212 KB Output is correct
9 Correct 1 ms 212 KB Output is correct
10 Correct 1 ms 212 KB Output is correct
11 Correct 1 ms 300 KB Output is correct
12 Correct 1 ms 300 KB Output is correct
13 Correct 1 ms 300 KB Output is correct
14 Correct 1 ms 300 KB Output is correct
15 Correct 1 ms 212 KB Output is correct
16 Correct 1 ms 212 KB Output is correct
17 Correct 0 ms 296 KB Output is correct
18 Correct 1 ms 212 KB Output is correct
19 Correct 1 ms 300 KB Output is correct
20 Correct 1 ms 340 KB Output is correct
21 Correct 1 ms 212 KB Output is correct
22 Incorrect 1 ms 296 KB 3rd lines differ - on the 1st token, expected: '2082', found: '107088'
23 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 276 KB 3rd lines differ - on the 1st token, expected: '3304', found: '23486'
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB Output is correct
2 Correct 0 ms 212 KB Output is correct
3 Correct 0 ms 296 KB Output is correct
4 Correct 0 ms 212 KB Output is correct
5 Correct 1 ms 212 KB Output is correct
6 Correct 1 ms 212 KB Output is correct
7 Correct 1 ms 212 KB Output is correct
8 Correct 1 ms 212 KB Output is correct
9 Correct 1 ms 212 KB Output is correct
10 Correct 1 ms 212 KB Output is correct
11 Correct 1 ms 300 KB Output is correct
12 Correct 1 ms 300 KB Output is correct
13 Correct 1 ms 300 KB Output is correct
14 Correct 1 ms 300 KB Output is correct
15 Correct 1 ms 212 KB Output is correct
16 Correct 1 ms 212 KB Output is correct
17 Correct 0 ms 296 KB Output is correct
18 Correct 1 ms 212 KB Output is correct
19 Correct 1 ms 300 KB Output is correct
20 Correct 1 ms 340 KB Output is correct
21 Correct 1 ms 212 KB Output is correct
22 Incorrect 1 ms 296 KB 3rd lines differ - on the 1st token, expected: '2082', found: '107088'
23 Halted 0 ms 0 KB -