Submission #1076034

#TimeUsernameProblemLanguageResultExecution timeMemory
1076034edogawa_something고대 책들 (IOI17_books)C++17
0 / 100
1 ms2396 KiB
#include "books.h"
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef vector<ll> vii;
typedef pair<ll,ll> pii;
#define F first
#define S second
#define all(v) v.begin(),v.end()
#define pb push_back
ll n,pre[2000000],suf[2000000];
bool vis[2000000];
long long minimum_walk(vector<int> p, int s) {
  n=p.size();
  ll res=0;
  bool chk=1;
  for(int i=0;i<n;i++) {
    if(p[i]!=i)
      chk=0;
  }
  if(chk)
    return 0;
  pre[0]=2*(p[0]>0);
  res+=pre[0];
  for(int i=1;i<n;i++) {
    if(p[i]>=i)
      pre[i]+=2;
    vis[p[i]]=1;
    if(vis[i])
      pre[i]-=2;
    pre[i]+=pre[i-1];
    res+=pre[i];
  }
  res-=pre[n-1];
  memset(vis,0,sizeof vis);
  suf[n-1]=2*(p[n-1]<n-1);
  for(int i=n-2;i>=0;i--) {
    if(p[i]<=i)
      suf[i]+=2;
    vis[p[i]]=1;
    if(vis[i])
      suf[i]-=2;
    suf[i]+=suf[i+1];
  }
  ll l=0,r=n-1;
  for(int i=n-1;i>=0;i--) {
    if(suf[i]>0) {
      r=i;
      break;
    }
  }
  for(int i=0;i<n;i++) {
    if(pre[i]>0) {
      l=i;
      break;
    }
  }
  if(s<l)
    res+=2*(l-s);
  else if(s>r)
    res+=2*(s-r);
  else {
    memset(vis,0,sizeof vis);
    for(int i=s;i<n;i++) {
      if(p[i]==i)
        res+=2,vis[i]=1;
      else
        break;
    }
    for(int i=s-1;i>=0;i--) {
      if(p[i]==i)
        res+=2,vis[i]=1;
      else
        break;
    }
  }
    for(int i=l;i<r;i++) {
      if(!vis[i]&&pre[i]==0)
        res+=2;
    }
  return res;
}
#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...