답안 #271529

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
271529 2020-08-18T06:33:26 Z hamerin 고대 책들 (IOI17_books) C++17
0 / 100
3 ms 512 KB
#include "books.h"

#include <bits/stdc++.h>

#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")

using namespace std;

using i64 = long long;
using d64 = long double;
using pi = pair<int, int>;
using pli = pair<i64, i64>;
using ti = tuple<int, int, int>;
using tli = tuple<i64, i64, i64>;

#define iterall(cont) cont.begin(), cont.end()
#define prec(n) setprecision(n) << fixed

i64 minimum_walk(vector<int> p, int s) {
    const int N = p.size();

    vector<vector<int>> cycles;
    vector<set<int>> cyc_st;
    vector<int> cyc(N);

    vector<bool> vst(N);
    for (int i = 0; i < N; i++) {
        if (vst[i]) continue;

        cycles.emplace_back(vector<int>());
        cyc_st.emplace_back(set<int>());

        int cur = i;
        while (cycles.back().empty() || cur != i) {
            cycles.back().emplace_back(cur);
            cyc_st.back().emplace(cur);
            cyc[cur] = cycles.size() - 1;
            vst[cur] = true;
            cur = p[cur];
        }
    }

    i64 ans = 0;
    for (int i = 0; i < N; i++) ans += abs(i - p[i]);

    vector<pi> intervals;
    for (auto &st : cyc_st)
        intervals.emplace_back(*st.begin(), *prev(st.end()));
    sort(iterall(intervals));

    // interval 합치기
    vector<pi> newIntervals;
    for (auto [l, r] : intervals) {
        if (!newIntervals.empty() && newIntervals.back().second > l) {
            newIntervals.back().second = r;
        } else {
            newIntervals.emplace_back(l, r);
        }
    }

    while (!newIntervals.empty() &&
           newIntervals.back().first == newIntervals.back().second)
        newIntervals.pop_back();

	cout<<newIntervals.size()<<endl;
    for (int i = 0; i < (int)newIntervals.size() - 1; i++) {
		cout<<i<<endl;
        ans += 2 * (newIntervals[i + 1].first - newIntervals[i].second);
    }

    // Strategy
    // Disjoint Set의 Lmost, Rmost interval까지의 거리 저장
    // Recursive하게 dp로 해결 가능할 듯


    return ans;
}

Compilation message

books.cpp: In function 'i64 minimum_walk(std::vector<int>, int)':
books.cpp:62:5: warning: this 'while' clause does not guard... [-Wmisleading-indentation]
   62 |     while (!newIntervals.empty() &&
      |     ^~~~~
books.cpp:66:2: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'while'
   66 |  cout<<newIntervals.size()<<endl;
      |  ^~~~
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 256 KB secret mismatch
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 256 KB secret mismatch
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 256 KB secret mismatch
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 3 ms 512 KB secret mismatch
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 256 KB secret mismatch
2 Halted 0 ms 0 KB -