Submission #137277

#TimeUsernameProblemLanguageResultExecution timeMemory
137277choikiwonAncient Books (IOI17_books)C++17
12 / 100
2 ms400 KiB
#include "books.h"
#include<bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef pair<int, int> pii;

const int maxn = 1000010;

int N, S;
int A[maxn], vis[maxn];
vector<pii> V;

ll minimum_walk(std::vector<int> p, int s) {
	N = p.size();
	S = s;
	for(int i = 0; i < N; i++) {
        A[i] = p[i];
	}

	ll ret = 0;
	for(int i = 0; i < N; i++) {
        if(vis[i]) continue;

        int mx = -1e9;

        int u = i;
        while(!vis[u]) {
            vis[u] = 1;
            mx = max(mx, u);

            ret += abs(u - A[u]);
            u = A[u];
        }

        if(mx != i) {
            V.push_back(pii(i, mx));
        }
	}

	if(V.size() == 0) return ret;

	int lmx = 0;
	int rmx = 0;
	int st = 0;
	int ed = 0;
	for(int i = 0; i < V.size(); i++) {
        if(ed < V[i].first) {
            if(ed < S) {
                lmx = max(lmx, S - ed);
            }
            if(S < st) {
                rmx = max(rmx, st - S);
            }

            st = V[i].first;
            ed = V[i].second;
            continue;
        }
        ed = max(ed, V[i].second);
	}

	if(ed < S) {
        lmx = max(lmx, S - ed);
    }
    if(S < st) {
        rmx = max(rmx, st - S);
    }

	ret += 2 * lmx;
	ret += 2 * rmx;

	return ret;
}

Compilation message (stderr)

books.cpp: In function 'll minimum_walk(std::vector<int>, int)':
books.cpp:47:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i = 0; i < V.size(); i++) {
                 ~~^~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...