Submission #577726

# Submission time Handle Problem Language Result Execution time Memory
577726 2022-06-15T08:25:57 Z Theo830 Ancient Books (IOI17_books) C++17
12 / 100
1 ms 340 KB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll INF = 1e9;
ll MOD = 998244353;
typedef pair<ll,ll> ii;
#define iii pair<int,int>
#define f(i,a,b) for(ll i = a;i < b;i++)
#define pb push_back
#define vll vector<ll>
#define F first
#define S second
#define all(x) (x).begin(), (x).end()
///I hope I will get uprating and don't make mistakes
///I will never stop programming
///sqrt(-1) Love C++
///Please don't hack me
///@TheofanisOrfanou Theo830
///Think different approaches (bs,dp,greedy,graphs,shortest paths,mst)
///Stay Calm
///Look for special cases
///Beware of overflow and array bounds
///Think the problem backwards
///Training
#include "books.h"
long long minimum_walk(std::vector<int> p, int s) {
    ll ans = 0;
    ll n = p.size();
    bool v[n] = {0};
    ll dist = 0;
    ll l[n],r[n];
    vector<ii>rang;
    ll L = -1,R;
    if(p[s] == s){
        L = R = s;
    }
    f(i,0,n){
        if(p[i] != i && !v[i]){
            ll last = i;
            ll st = i;
            ll pos = p[i];
            v[i] = 1;
            l[st] = i,r[st] = pos;
            while(pos != st){
                l[st] = min(l[st],pos);
                r[st] = max(r[st],pos);
                v[pos] = 1;
                ans += abs(pos - last);
                last = pos;
                pos = p[pos];
            }
            ans += abs(pos - last);
            l[st] = min(l[st],pos);
            r[st] = max(r[st],pos);
            rang.pb(ii(l[st],r[st]));
            if(v[s] == 1 && L == -1){
                L = l[st];
                R = r[st];
            }
        }
    }
    if(rang.empty()){
        return ans;
    }
    vector<ii>left,right;
    ll LL = L,RR = R;
    for(auto x:rang){
        if(LL <= x.F && x.F <= RR){
            L = min(L,x.F);
            R = max(R,x.S);
        }
        else if(LL <= x.S && x.S <= RR){
            L = min(L,x.F);
            R = max(R,x.S);
        }
        else if(x.F <= LL && RR <= x.S){
            L = min(L,x.F);
            R = max(R,x.S);
        }
        else if(x.F < L){
            left.pb(ii(x.S,x.F));
        }
        else{
            right.pb(ii(x.F,x.S));
        }
    }
    sort(all(left));
    reverse(all(left));
    sort(all(right));
    while(!left.empty()){
        dist += L - left.back().F;
        L = left.back().S;
        while(!left.empty() && left.back().F >= L){
            L = min(L,left.back().S);
            left.pop_back();
        }
    }
    while(!right.empty()){
        dist += right.back().F - R;
        R = right.back().S;
        while(!right.empty() && right.back().F <= R){
            R = max(R,right.back().S);
            right.pop_back();
        }
    }
    ans += 2 * dist;
    return ans;
}
/*
int main() {
    int n, s;
    assert(2 == scanf("%d %d", &n, &s));

    vector<int> p((unsigned) n);
    for(int i = 0; i < n; i++)
        assert(1 == scanf("%d", &p[(unsigned) i]));

    long long res = minimum_walk(p, s);
    printf("%lld\n", res);

    return 0;
}
*/
/*
4 0
0 2 3 1
*/

Compilation message

books.cpp: In function 'long long int minimum_walk(std::vector<int>, int)':
books.cpp:76:27: warning: 'R' may be used uninitialized in this function [-Wmaybe-uninitialized]
   76 |         else if(x.F <= LL && RR <= x.S){
      |                           ^
# Verdict Execution time Memory Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 1 ms 296 KB Output is correct
3 Correct 1 ms 300 KB Output is correct
4 Correct 1 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 212 KB Output is correct
12 Correct 1 ms 212 KB Output is correct
13 Correct 1 ms 300 KB Output is correct
14 Correct 1 ms 212 KB Output is correct
15 Correct 1 ms 300 KB Output is correct
16 Correct 1 ms 212 KB Output is correct
17 Correct 1 ms 292 KB Output is correct
18 Correct 0 ms 212 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 1 ms 296 KB Output is correct
3 Correct 1 ms 300 KB Output is correct
4 Correct 1 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 212 KB Output is correct
12 Correct 1 ms 212 KB Output is correct
13 Correct 1 ms 300 KB Output is correct
14 Correct 1 ms 212 KB Output is correct
15 Correct 1 ms 300 KB Output is correct
16 Correct 1 ms 212 KB Output is correct
17 Correct 1 ms 292 KB Output is correct
18 Correct 0 ms 212 KB Output is correct
19 Correct 1 ms 212 KB Output is correct
20 Correct 1 ms 212 KB Output is correct
21 Correct 1 ms 212 KB Output is correct
22 Incorrect 1 ms 340 KB 3rd lines differ - on the 1st token, expected: '2082', found: '2780'
23 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 1 ms 296 KB Output is correct
3 Correct 1 ms 300 KB Output is correct
4 Correct 1 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 212 KB Output is correct
12 Correct 1 ms 212 KB Output is correct
13 Correct 1 ms 300 KB Output is correct
14 Correct 1 ms 212 KB Output is correct
15 Correct 1 ms 300 KB Output is correct
16 Correct 1 ms 212 KB Output is correct
17 Correct 1 ms 292 KB Output is correct
18 Correct 0 ms 212 KB Output is correct
19 Correct 1 ms 212 KB Output is correct
20 Correct 1 ms 212 KB Output is correct
21 Correct 1 ms 212 KB Output is correct
22 Incorrect 1 ms 340 KB 3rd lines differ - on the 1st token, expected: '2082', found: '2780'
23 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 0 ms 212 KB 3rd lines differ - on the 1st token, expected: '3304', found: '2730'
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 1 ms 296 KB Output is correct
3 Correct 1 ms 300 KB Output is correct
4 Correct 1 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 212 KB Output is correct
12 Correct 1 ms 212 KB Output is correct
13 Correct 1 ms 300 KB Output is correct
14 Correct 1 ms 212 KB Output is correct
15 Correct 1 ms 300 KB Output is correct
16 Correct 1 ms 212 KB Output is correct
17 Correct 1 ms 292 KB Output is correct
18 Correct 0 ms 212 KB Output is correct
19 Correct 1 ms 212 KB Output is correct
20 Correct 1 ms 212 KB Output is correct
21 Correct 1 ms 212 KB Output is correct
22 Incorrect 1 ms 340 KB 3rd lines differ - on the 1st token, expected: '2082', found: '2780'
23 Halted 0 ms 0 KB -