이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
// ~ Be Name Khoda ~ //
#include "books.h"
#include <bits/stdc++.h>
//#pragma GCC optimize ("O3")
//#pragma GCC target("avx2")
//#pragma GCC optimize("unroll-loops,Ofast")
using namespace std;
typedef long long ll;
#define pb push_back
#define mp make_pair
#define all(x) x.begin(), x.end()
#define fi first
#define se second
const int maxn = 1e6 + 10;
const int maxn5 = 1e6 + 10;
const int maxnt = 1.2e6 + 10;
const int maxn3 = 1e3 + 10;
const int mod = 1e9 + 7;
const ll inf = 1e18;
int cmp[maxn5], lef[maxn5], rig[maxn5], num = 0;
bool mark[maxn5];
vector <int> per;
void expa(int &l, int &r){
int lq = l, rq = r;
while(true){
lq = min({lq, lef[cmp[l]], lef[cmp[r]]});
rq = max({rq, rig[cmp[l]], rig[cmp[r]]});
//cout << "haaaa " << l << ' ' << r << ' ' << lq << ' ' << rq << endl;
if(l > lq){
l--;
continue;
}
if(r < rq){
r++;
continue;
}
break;
}
}
int solve(int lq, int rq, int s){
int l = s, r = s;
expa(l, r);
int ans = 0;
//cout << l << ' ' << r << ' ' << lq << ' ' << rq << endl;
while(l > lq || r < rq){
int c1 = 0, c2 = 0;
int l1 = l, r1 = r, l2 = l, r2 = r;
while(r1 <= r && l1 > lq){
l1--;
c1++;
expa(l1, r1);
}
while(l2 >= l && r2 < rq){
r2++;
//cout << r2 << ' ' << cmp[r2] << ' ' << rig[cmp[r2]] << endl;
c2++;
expa(l2, r2);
//cout << "hoy " << l2 << ' ' << r2 << ' ' << rig[cmp[r2]] << ' ' << cmp[r2] << endl;
}
ans += min(c1, c2) * 2;
l = min(l1, l2);
r = max(r1, r2);
if(l2 != lq || r1 != rq)
ans += max(c1, c2) * 2;
//cout << l << ' ' << r << ' ' << ans << ' ' << c1 << ' ' << c2 << endl;
//cout << l2 << ' ' << r2 << endl;
}
return ans;
}
void dfs(int v){
mark[v] = true;
cmp[v] = num;
lef[num] = min(lef[num], v);
rig[num] = max(rig[num], v);
if(!mark[per[v]])
dfs(per[v]);
}
long long minimum_walk(std::vector<int> PER, int s) {
per = PER;
int n = per.size();
int r = s, l = s;
ll ans = 0;
for(int i = 0; i < n; i++){
if(!mark[i]){
lef[num] = rig[num] = i;
dfs(i);
num++;
}
//cout << i << ' ' << per[i] << ' ' << cmp[i] << endl;
ans += abs(per[i] - i);
if(i != per[i]){
l = min(l, i);
r = max(r, i);
}
}
if(l == r)
return 0;
//cout << "ha? " << ans << endl;
//cout << l << ' ' << r << ' ' << s << ' ' << cmp[l] << ' ' << cmp[r] << ' ' << num << ' ' << ans << endl;
return solve(l, r, s) + ans;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |