제출 #539185

#제출 시각아이디문제언어결과실행 시간메모리
539185vectorRope (JOI17_rope)C++17
100 / 100
1384 ms134064 KiB
#include<bits/stdc++.h> #define SIZE 1000001 using namespace std; int N,M,A[SIZE],B[SIZE],C[SIZE],D[SIZE],ans[SIZE],mx; bool vis[SIZE]; vector<int>v1[SIZE],v2[SIZE]; int main() { ios_base::sync_with_stdio(0),cin.tie(0); cin>>N>>M; for(int i=1;i<=N;i++){ cin>>A[i]; B[A[i]]++; } for(int i=1;i<=M;i++){ C[B[i]]++; mx=max(mx,B[i]); ans[i]=1e9; } for(int i=1;i<N;i+=2){ v1[A[i]].push_back(A[i+1]); v1[A[i+1]].push_back(A[i]); } for(int i=1;i<=M;i++){ int mx1=mx; vector<int>u; u.push_back(i); for(int j:v1[i]){ u.push_back(j); D[j]++; } D[i]=B[i]; for(int j:u)if(!vis[j]){ C[B[j]-D[j]]++; C[B[j]]--; vis[j]=true; } while(!C[mx1])mx1--; for(int j:u){ C[B[j]-D[j]]--; D[j]=0,vis[j]=false; C[B[j]]++; } ans[i]=min(ans[i],N-B[i]-mx1); } for(int i=2;i<N;i+=2){ v2[A[i]].push_back(A[i+1]); v2[A[i+1]].push_back(A[i]); } for(int i=1;i<=M;i++){ int mx1=mx; vector<int>u; u.push_back(i); for(int j:v2[i]){ u.push_back(j); D[j]++; } D[i]=B[i]; for(int j:u)if(!vis[j]){ C[B[j]-D[j]]++; C[B[j]]--; vis[j]=true; } while(!C[mx1])mx1--; for(int j:u){ C[B[j]-D[j]]--; D[j]=0,vis[j]=false; C[B[j]]++; } ans[i]=min(ans[i],N-B[i]-mx1); printf("%d\n",ans[i]); } }
#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...