Submission #1034948

#TimeUsernameProblemLanguageResultExecution timeMemory
1034948vjudge1Ancient Books (IOI17_books)C++17
50 / 100
1425 ms144200 KiB
#include "books.h" #include<bits/stdc++.h> using namespace std; int par[1001000],sz[1001000]; int abp(int n){ return par[n]?par[n]=abp(par[n]):n; } int merge(int a,int b){ a=abp(a+1);b=abp(b+1); if(a-b)par[a]=b, sz[b]+=sz[a]; return a!=b; } set<int>notanedge,ST; map<int,int>mp; void mergefrom(int l,int r){ ST.insert(l),ST.insert(r); while(notanedge.lower_bound(l)!=notanedge.lower_bound(r)){ int k=*notanedge.lower_bound(l); merge(k,k+1); notanedge.erase(k); mp[k];mp[k+1]; } } long long minimum_walk(std::vector<int> p, int s) { long long ans=0; int n=p.size(),K=0; for(int i=0;i<n-1;i++) notanedge.insert(i); for(int i=0;i<n;i++) if(i-p[i]) ans+=abs(i-p[i]), mergefrom(i,p[i]); if(ST.empty())return 0; vector<tuple<int,int,int>>v; auto it=ST.lower_bound(s); int ans2=1e9; if(it!=ST.end()) ans2=min(ans2,*it-s); if(it!=ST.begin()) ans2=min(ans2,s-*--it); for(auto [i,j]:mp){ auto it=mp.upper_bound(i); if(it!=mp.end()) v.push_back({it->first-i,i,it->first}); } sort(v.begin(),v.end()); for(auto [w,x,y]:v) ans+=w*2*merge(x,y); return ans+2*ans2; }

Compilation message (stderr)

books.cpp: In function 'long long int minimum_walk(std::vector<int>, int)':
books.cpp:27:20: warning: unused variable 'K' [-Wunused-variable]
   27 |     int n=p.size(),K=0;
      |                    ^
#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...