Submission #429112

# Submission time Handle Problem Language Result Execution time Memory
429112 2021-06-15T17:31:59 Z Dremix10 Ancient Books (IOI17_books) C++17
0 / 100
1 ms 304 KB
#include "books.h"
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pi;
typedef pair<ll,ll> pl;
#define endl '\n'
#define F first
#define S second
#define all(x) (x).begin(),(x).end()
const int N = 1e6+5;
const ll INF = 2e18;
const int MOD = 1e9+7;

int l[N],r[N],par[N];

int find(int x){
    return (par[x] == x) ? x : par[x] = find(par[x]);
}

void join(int x, int y){
    x = find(x);
    y = find(y);
    if(x==y)return;
    par[y] = x;
    l[x] = min(l[x],l[y]);
    r[x] = max(r[x],r[y]);
}

long long minimum_walk(vector<int> p, int s) {
    int i,j,n = p.size();

    ll ans = 0;
    bool ok[n] = {};
    int cnt = 0;

    for(i=0;i<n;i++){
        if(p[i] == i){
            ok[i] = true;
            cnt++;
        }
        l[i] = i,r[i] = i,par[i] = i;
    }

    i = 0;

    while(cnt < n){
        while(ok[i]){
            i++;
            //ans++;
        }
        int fin = i;
        ans += abs(p[i] - i);
        i = p[i];
        ok[i] = true;
        cnt++;
        while(i != fin){
            join(i,fin);
            ans += abs(p[i] - i);
            i = p[i];
            ok[i] = true;
            cnt++;
        }
        //cout<<cnt<<" "<<ans<<" "<<i<<endl;
    }

    int low=s,high=s;
    i=s,j=s;
    while(i>0 || j<n-1){
        int curr;
        if(i >= 0)
            curr = find(i);
        else
            curr = find(j);
        bool ok = 0;

        low = min(low,l[curr]);
        while(i > low){
            i--;
            ok = 1;
            join(curr,i);
            low = min(low,l[curr]);
        }

        high = max(high,r[curr]);
        while(j < high){
            j++;
            ok = 1;
            join(curr,j);
            high = max(high,r[curr]);
        }

        if(!ok){
            i--;
            while(i>=0 && i==par[i])
                i--;

            j++;
            while(j<n && j==par[j])
                j++;

            if(i==-1 && j==n)break;
            if(i==-1 || j<n && low-i > j-high){
                /// go right (high)
                ans += (j-high)*2;
                join(curr,j);
            }
            else{
                assert(j==n || i>=0 && low-i < j-high);
                /// go left (low)
                ans += (low-i)*2;
                join(curr,i);
            }
        }
    }

    return ans;
}

Compilation message

books.cpp: In function 'long long int minimum_walk(std::vector<int>, int)':
books.cpp:103:29: warning: suggest parentheses around '&&' within '||' [-Wparentheses]
  103 |             if(i==-1 || j<n && low-i > j-high){
      |                         ~~~~^~~~~~~~~~~~~~~~~
In file included from /usr/include/c++/10/cassert:44,
                 from /usr/include/x86_64-linux-gnu/c++/10/bits/stdc++.h:33,
                 from books.cpp:2:
books.cpp:109:37: warning: suggest parentheses around '&&' within '||' [-Wparentheses]
  109 |                 assert(j==n || i>=0 && low-i < j-high);
      |                                ~~~~~^~~~~~~~~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Correct 1 ms 204 KB Output is correct
2 Correct 1 ms 204 KB Output is correct
3 Correct 1 ms 296 KB Output is correct
4 Correct 1 ms 204 KB Output is correct
5 Correct 1 ms 204 KB Output is correct
6 Correct 1 ms 296 KB Output is correct
7 Correct 1 ms 204 KB Output is correct
8 Correct 1 ms 204 KB Output is correct
9 Correct 1 ms 204 KB Output is correct
10 Incorrect 1 ms 204 KB 3rd lines differ - on the 1st token, expected: '4', found: '8'
11 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1 ms 204 KB Output is correct
2 Correct 1 ms 204 KB Output is correct
3 Correct 1 ms 296 KB Output is correct
4 Correct 1 ms 204 KB Output is correct
5 Correct 1 ms 204 KB Output is correct
6 Correct 1 ms 296 KB Output is correct
7 Correct 1 ms 204 KB Output is correct
8 Correct 1 ms 204 KB Output is correct
9 Correct 1 ms 204 KB Output is correct
10 Incorrect 1 ms 204 KB 3rd lines differ - on the 1st token, expected: '4', found: '8'
11 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1 ms 204 KB Output is correct
2 Correct 1 ms 204 KB Output is correct
3 Correct 1 ms 296 KB Output is correct
4 Correct 1 ms 204 KB Output is correct
5 Correct 1 ms 204 KB Output is correct
6 Correct 1 ms 296 KB Output is correct
7 Correct 1 ms 204 KB Output is correct
8 Correct 1 ms 204 KB Output is correct
9 Correct 1 ms 204 KB Output is correct
10 Incorrect 1 ms 204 KB 3rd lines differ - on the 1st token, expected: '4', found: '8'
11 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 1 ms 304 KB 3rd lines differ - on the 1st token, expected: '3304', found: '3450'
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1 ms 204 KB Output is correct
2 Correct 1 ms 204 KB Output is correct
3 Correct 1 ms 296 KB Output is correct
4 Correct 1 ms 204 KB Output is correct
5 Correct 1 ms 204 KB Output is correct
6 Correct 1 ms 296 KB Output is correct
7 Correct 1 ms 204 KB Output is correct
8 Correct 1 ms 204 KB Output is correct
9 Correct 1 ms 204 KB Output is correct
10 Incorrect 1 ms 204 KB 3rd lines differ - on the 1st token, expected: '4', found: '8'
11 Halted 0 ms 0 KB -