답안 #578453

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
578453 2022-06-17T01:34:56 Z definitelynotmee 고대 책들 (IOI17_books) C++
12 / 100
1 ms 340 KB
#include<bits/stdc++.h>
#include "books.h"
using namespace std;
#define ff first
#define ss second
#define all(x) x.begin(), x.end()
using ll = long long;
using pii = pair<int,int>;
using pll = pair<ll,ll>;
template<typename T>
using matrix = vector<vector<T>>;
const int INF = 1e9;
long long minimum_walk(std::vector<int> p, int s) {
    int n = p.size();
    ll resp =0;

    for(int i = 0; i < n; i++){
        resp+=abs(i-p[i]);
    }
    vector<pii> crange(n);
    vector<int> cycle(n), check(n);
    auto dfs = [&](int id, int cid, auto dfs)->int{
        cycle[id] = cid;
        check[id] = 1;
        if(check[p[id]])
            return id;
        return max(id,dfs(p[id],cid,dfs));
    };
    vector<int> isgood(n);
    vector<int> cycles;
    
    for(int i = 0; i < n; i++){
        if(!check[i]){
            int r = dfs(i,i,dfs);
            crange[i] = {i,r};
            isgood[i] = cycles.empty() || crange[cycles.back()].ss < i;
            if(r-i && isgood[i])
                cycles.push_back(i);
        }
    }
    
    for(int i = 0; i < (int)cycles.size()-1; i++){
        resp+= 2*(crange[cycles[i+1]].ff-crange[cycles[i]].ss);
    }
    if(cycles.empty())
        return resp;
    if(s < crange[cycles[0]].ff || s > crange[cycles.back()].ss){
        resp+=max(crange[cycles[0]].ff-s, s-crange[cycles.back()].ss)*2;
        return resp;
    }
    
    matrix<pii> g(n);
    for(int i = 0; i < n; i++){
        int cur = cycle[i];
        if(i!=n-1)
            g[cur].push_back({cycle[i+1], crange[cur].ss >= i+1 ? 0 : 2});
        if(i)
            g[cur].push_back({cycle[i-1], crange[cur].ff <= i-1 ? 0 : 2});
    }
    
    priority_queue<pii,vector<pii>,greater<pii>> pq;
    vector<int> dist(n,INF);
    pq.push({0,cycle[s]});
    dist[cycle[s]] = 0;

    while(!pq.empty()){
        int cur = pq.top().ff, curp = pq.top().ss;
        pq.pop();
        if(curp> dist[cur])
            continue;
        for(auto [viz,vizp] : g[cur]){
            if(dist[viz] > vizp+dist[cur]){
                dist[viz]= vizp+dist[cur];
                pq.push({viz,dist[viz]});
            }
        }
    }
    
    int add = INF;
    for(int i = 0; i < n; i++){
        if(isgood[i])
            add = min(add,dist[i]);
    }
    resp+=add;
    return resp;
}

Compilation message

books.cpp: In function 'long long int minimum_walk(std::vector<int>, int)':
books.cpp:71:18: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   71 |         for(auto [viz,vizp] : g[cur]){
      |                  ^
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB Output is correct
2 Correct 1 ms 304 KB Output is correct
3 Correct 1 ms 212 KB Output is correct
4 Correct 1 ms 212 KB Output is correct
5 Correct 1 ms 300 KB Output is correct
6 Correct 1 ms 296 KB Output is correct
7 Correct 1 ms 212 KB Output is correct
8 Correct 1 ms 296 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 212 KB Output is correct
14 Correct 1 ms 212 KB Output is correct
15 Correct 1 ms 212 KB Output is correct
16 Correct 1 ms 212 KB Output is correct
17 Correct 1 ms 212 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 1 ms 304 KB Output is correct
3 Correct 1 ms 212 KB Output is correct
4 Correct 1 ms 212 KB Output is correct
5 Correct 1 ms 300 KB Output is correct
6 Correct 1 ms 296 KB Output is correct
7 Correct 1 ms 212 KB Output is correct
8 Correct 1 ms 296 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 212 KB Output is correct
14 Correct 1 ms 212 KB Output is correct
15 Correct 1 ms 212 KB Output is correct
16 Correct 1 ms 212 KB Output is correct
17 Correct 1 ms 212 KB Output is correct
18 Correct 1 ms 212 KB Output is correct
19 Correct 1 ms 340 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 340 KB 3rd lines differ - on the 1st token, expected: '2082', found: '2110'
23 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB Output is correct
2 Correct 1 ms 304 KB Output is correct
3 Correct 1 ms 212 KB Output is correct
4 Correct 1 ms 212 KB Output is correct
5 Correct 1 ms 300 KB Output is correct
6 Correct 1 ms 296 KB Output is correct
7 Correct 1 ms 212 KB Output is correct
8 Correct 1 ms 296 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 212 KB Output is correct
14 Correct 1 ms 212 KB Output is correct
15 Correct 1 ms 212 KB Output is correct
16 Correct 1 ms 212 KB Output is correct
17 Correct 1 ms 212 KB Output is correct
18 Correct 1 ms 212 KB Output is correct
19 Correct 1 ms 340 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 340 KB 3rd lines differ - on the 1st token, expected: '2082', found: '2110'
23 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 296 KB 3rd lines differ - on the 1st token, expected: '3304', found: '1000002744'
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB Output is correct
2 Correct 1 ms 304 KB Output is correct
3 Correct 1 ms 212 KB Output is correct
4 Correct 1 ms 212 KB Output is correct
5 Correct 1 ms 300 KB Output is correct
6 Correct 1 ms 296 KB Output is correct
7 Correct 1 ms 212 KB Output is correct
8 Correct 1 ms 296 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 212 KB Output is correct
14 Correct 1 ms 212 KB Output is correct
15 Correct 1 ms 212 KB Output is correct
16 Correct 1 ms 212 KB Output is correct
17 Correct 1 ms 212 KB Output is correct
18 Correct 1 ms 212 KB Output is correct
19 Correct 1 ms 340 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 340 KB 3rd lines differ - on the 1st token, expected: '2082', found: '2110'
23 Halted 0 ms 0 KB -