제출 #669888

#제출 시각아이디문제언어결과실행 시간메모리
669888flappybirdAncient Books (IOI17_books)C++17
12 / 100
14 ms24148 KiB
#include "books.h"
#include <bits/stdc++.h>
using namespace std;
#define MAX 1010101
typedef pair<int, int> pii;
typedef long long ll;

int p[MAX];
ll ans = 0;
int N;
vector<vector<int>> cyc;
int cycnt;
int vis[MAX];
int chk[MAX];
int prt[MAX];
int lv[MAX];
int rv[MAX];
vector<int> adj[MAX];
vector<int> lst;
int s;
void dfs(int x) {
	lst.push_back(x);
	for (auto v : adj[x]) if (lv[v] <= s && s <= rv[v]) dfs(v);
}
long long minimum_walk(std::vector<int> p, int _s) {
	s = _s;
	N = p.size();
	int i;
	for (i = 0; i < N; i++) if (i != p[i]) break;
	int er = i;
	if (i == N) return 0;
	int fcnt = 0;
	for (; i < N; i++) p[fcnt++] = p[i] - er;
	s -= er;
	if (s < 0) ans += 2ll * (-s), s = 0;
	N = fcnt;
	p.resize(N);
	while ((p.back() + 1) == (int)p.size()) p.pop_back();
	N = p.size();
	if (s >= N) ans += 2ll * (s - N + 1), s = N - 1;
	for (i = 0; i < N; i++) ans += abs(p[i] - i);
	for (i = 0; i < N; i++) {
		if (vis[i]) continue;
		vector<int> vlist;
		int v = i;
		while (!vis[v]) {
			vis[v] = 1;
			vlist.push_back(v);
			v = p[v];
		}
		cycnt++;
		cyc.push_back(vlist);
	}
	vector<pair<pii, int>> vpi;
	int X = cyc.size();
	for (auto& v : cyc) {
		sort(v.begin(), v.end());
		vpi.emplace_back(pii(v[0], v.back()), 0);
	}
	i = 0;
	for (auto& [_, x] : vpi) x = i++;
	sort(vpi.begin(), vpi.end());
	vector<pair<pii, int>> stk;
	for (i = 0; i < vpi.size(); i++) {
		while (stk.size() && stk.back().first.second < vpi[i].first.first) stk.pop_back();
		vector<int> er;
		int t = -1;
		while (stk.size() && vpi[i].first.first <= stk.back().first.second && stk.back().first.second <= vpi[i].first.second) {
			er.push_back(stk.back().second);
			stk.pop_back();
		}
		if (er.size()) {
			t = er.back();
			er.push_back(i);
			for (auto x : er) {
				chk[x] = 1;
				if (cyc[t].size() < cyc[x].size()) swap(cyc[t], cyc[x]);
				for (auto v : cyc[x]) cyc[t].push_back(v);
			}
			stk.emplace_back(pii(cyc[t][0], vpi[i].second), t);
		}
		else {
			if (stk.empty()) prt[i] = -1;
			else prt[i] = stk.back().second;
			stk.push_back(vpi[i]);
		}
	}
	vector<int> all;
	for (i = 0; i < X; i++) {
		if (!chk[i]) {
			sort(cyc[i].begin(), cyc[i].end());
			lv[i] = cyc[i][0];
			rv[i] = cyc[i].back();
			if (~prt[i]) adj[prt[i]].push_back(i);
		}
	}
	for (i = 0; i < cyc.size(); i++) if (!~prt[i]) all.push_back(i);
	for (i = 1; i < all.size(); i++) ans += 2ll * (lv[all[i]] - rv[all[i - 1]]);
	int rt = -1;
	for (auto v : all) {
		if (lv[v] <= s && s <= rv[v]) {
			rt = v;
			break;
		}
	}
	dfs(rt);
	int pv = 0;
	for (i = 1; i < lst.size(); i++) {
		int sz = cyc[lst[pv]].size();
		int ind = lower_bound(cyc[lst[pv]].begin(), cyc[lst[pv]].end(), lv[lst[i]]) - cyc[lst[pv]].begin();
		int c;
		if (ind == sz) c = 0;
		else if (cyc[lst[pv]][ind] <= rv[i]) c = 1;
		else c = 0;
		if (c) continue;
		else {
			ind = lower_bound(cyc[lst[pv]].begin(), cyc[lst[pv]].end(), lv[lst[i]]) - cyc[lst[pv]].begin();
			ind--;
			int mn = 2e9;
			if (0 <= ind && ind < sz) mn = min(mn, abs(cyc[lst[pv]][ind] - lv[i]));
			ind = upper_bound(cyc[lst[pv]].begin(), cyc[lst[pv]].end(), rv[lst[i]]) - cyc[lst[pv]].begin();
			if (0 <= ind && ind < sz) mn = min(mn, abs(cyc[lst[pv]][ind] - rv[i]));
			ans += 2ll * mn;
			pv = i;
		}
	}
	return ans;
}

컴파일 시 표준 에러 (stderr) 메시지

books.cpp: In function 'long long int minimum_walk(std::vector<int>, int)':
books.cpp:64:16: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<std::pair<int, int>, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   64 |  for (i = 0; i < vpi.size(); i++) {
      |              ~~^~~~~~~~~~~~
books.cpp:97:16: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::vector<int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   97 |  for (i = 0; i < cyc.size(); i++) if (!~prt[i]) all.push_back(i);
      |              ~~^~~~~~~~~~~~
books.cpp:98:16: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   98 |  for (i = 1; i < all.size(); i++) ans += 2ll * (lv[all[i]] - rv[all[i - 1]]);
      |              ~~^~~~~~~~~~~~
books.cpp:108:16: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  108 |  for (i = 1; i < lst.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...