제출 #72760

#제출 시각아이디문제언어결과실행 시간메모리
72760FLDutchman고대 책들 (IOI17_books)C++14
100 / 100
414 ms182948 KiB
#include "books.h" #include <bits/stdc++.h> using namespace std; typedef int INT; #define fst first #define snd second #define FOR(i,l,r) for(int i = (l); i < (r); i++) #define pb push_back #define int long long typedef vector<int> vi; typedef pair<int, int> ii; typedef vector<ii> vii; int N; vi p; vi color; vii interval; vii segments; void expand(int &l, int &r){ //cout << "expanding " << l << " " << r << endl; int gl = l-1, gr = r+1; while(l != gl || r != gr){ //cout << l << " " << r << endl; //cout << gl << " " << gr << endl; if(l != gl) {l--; gl = min(gl, interval[color[l]].fst); gr = max(gr, interval[color[l]].snd);} if(r != gr) {r++; gl = min(gl, interval[color[r]].fst); gr = max(gr, interval[color[r]].snd);} } //cout << l << " " << r << endl; } long long minimum_walk(std::vector<INT> P, INT s) { FOR(i, 0, P.size()) p.pb(P[i]); N = p.size(); color.assign(N, -1); int c = 0; FOR(i, 0, N) if(color[i] == -1){ int j = i; int l = i, r = i; while(color[j] == -1){ color[j] = c; j = p[j]; r = max(j, r); l = min(j, r); } interval.pb({l, r}); c++; } if(interval.size() == 0) return 0; //cout << "colors\n"; //for(int c : color) cout<<c<<" "; //cout<<endl; //for(ii p : interval) cout << p.fst << " " << p.snd << endl; interval.pb({-2,-1}); int k = 0; while(interval[k].fst == interval[k].snd) k++; if(interval[k].fst == -2) return 0; int l = interval[k].fst, r = interval[k].snd; for(ii inter : interval) if(inter.fst != inter.snd){ if(r < inter.fst) { segments.pb({l, r}); l = inter.fst, r = inter.snd; } else r = max(r, inter.snd); } //cout << "intervals\n"; //FOR(i, 0, N) cout << interval[color[i]].fst << " " << interval[color[i]].snd << endl; segments.pb({l, r}); int res = 0; FOR(i, 1, segments.size()){ res += 2*(segments[i].fst - segments[i-1].snd); } for(auto seg : segments) if(seg.fst <= s and s <= seg.snd){ int l = s+1, r = s-1; res -= 2; while(l != seg.fst or r != seg.snd){ expand(l, r); res += 2; } } //cout<<res<<endl; //for(ii p : segments) cout << p.fst << " " << p.snd << endl; if(s < segments[0].fst) res += 2*(segments[0].fst-s); if(s > segments.back().snd) res += 2*(s - segments.back().snd); FOR(i, 0, N) res += abs(i-p[i]); return res; }

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

books.cpp: In function 'long long int minimum_walk(std::vector<int>, INT)':
books.cpp:9:39: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
 #define FOR(i,l,r) for(int i = (l); i < (r); i++)
                                       ^
books.cpp:37:2: note: in expansion of macro 'FOR'
  FOR(i, 0, P.size()) p.pb(P[i]);
  ^~~
books.cpp:9:39: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
 #define FOR(i,l,r) for(int i = (l); i < (r); i++)
                                       ^
books.cpp:75:2: note: in expansion of macro 'FOR'
  FOR(i, 1, segments.size()){
  ^~~
#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...