제출 #641487

#제출 시각아이디문제언어결과실행 시간메모리
641487ggoh고대 책들 (IOI17_books)C++14
50 / 100
341 ms90448 KiB
#include "books.h"
#include<bits/stdc++.h>
using namespace std;
#define sz(v) ((int)(v).size())
typedef long long lint;
 
int n,sz;
int v[1000002];
int d[1000002];
int le[1000002],ri[1000002];
vector<int>go;
vector<int>cycle[1000002];
lint cost[1000002];
void dfs(int p,int par)
{
  cycle[sz].push_back(p);
  cost[sz]+=abs(par-p);
  v[p]=1;
  if(!v[go[p]])dfs(go[p],p);
  else cost[sz]+=abs(go[p]-p);
}
lint minimum_walk(vector<int> p, int s) {
  n=sz(p);
  go=p;
  for(int i=0;i<n;i++)
  {
    if(!v[i])
    {
      sz++;
      dfs(i,i);
    }
  }
  vector<int>X;
  lint ans=0;
  int maxi=-1,mini=1e9;
  for(int i=1;i<=sz;i++)
  {
    ans+=cost[i];
    sort(cycle[i].begin(),cycle[i].end());
    d[cycle[i][0]]++;
    d[cycle[i][sz(cycle[i])-1]]--;
    if(sz(cycle[i])>1)
    {
      maxi=max(maxi,cycle[i][sz(cycle[i])-1]-1);
      mini=min(mini,cycle[i][0]);
      if(cycle[i][0]<s && s<cycle[i][sz(cycle[i])-1])
      {
        le[i]=-1e9;ri[i]=1e9;
        for(auto &k:cycle[i])
        {
          if(k<=s)le[i]=max(le[i],k);
          if(k>=s)ri[i]=min(ri[i],k);
        }
      }
    }
    else le[i]=ri[i]=s;
  }
  if(s!=0)
  {
    int cnt=0,tmp=1e9;
    for(int i=0;i<=s;i++)
    {
      for(int j=s;j<n;j++)
      {
        for(int k=1;k<=sz;k++)
        {
          if(le[k]>=i || ri[k]<=j)cnt++;
        }
        if(cnt==sz)
        {
          tmp=min(tmp,j-i);
        }
      }
    }
    ans+=2*tmp;
  }
  int c=0;
  for(int i=0;i<n;i++)
  {
    c+=d[i];
    d[i]=c;
  }
  if(s<=mini)
  {
    for(int i=s;i<=maxi;i++)
    {
      if(!d[i])ans+=2;
    }
  }
  else if(s>maxi)
  {
    for(int i=mini;i<s;i++)
    {
      if(!d[i])ans+=2;
    }
  }
  else
  {
    for(int i=mini;i<=maxi;i++)
    {
      if(!d[i])ans+=2;
    }
  }
	return ans;
}
#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...