Submission #1165411

#TimeUsernameProblemLanguageResultExecution timeMemory
1165411KhoaDuyVrtić (COCI18_vrtic)C++17
80 / 160
534 ms327680 KiB
#include<bits/stdc++.h> using namespace std; const int MAXN=150,MAX=5*1e6; int DP[MAX],cost[MAXN+1][MAXN+1],trace[MAXN+1]; int c[MAXN+1],order[MAXN+1]; bool vis[MAXN+1]; vector<vector<int>> graph(MAXN+1); bool cmp(int i,int j){ return (c[i]<c[j]); } int sz=0; void DFS(int u){ sz++; vis[u]=true; for(int v:graph[u]){ if(!vis[v]){ DFS(v); } } } int base[MAXN+1],cnt[MAXN+1],pro[MAXN+1]; int m=0; vector<int> decode(int x){ vector<int> v(m); for(int i=m-1;i>=0;i--){ v[i]=x%base[i]; x/=base[i]; } return v; } int idx[MAXN+1]; void getans(int u,int l,int r){ vis[u]=true; for(int v:graph[u]){ if(!vis[v]){ if((idx[u]-l)&1){ idx[v]=idx[u]-2; } else{ if(idx[u]+2<=r){ idx[v]=idx[u]+2; } else if(idx[u]<r){ idx[v]=r; } else{ idx[v]=r-1; } } getans(v,l,r); } } } signed main(){ //freopen("vrtic.inp","r",stdin); //freopen("vrtic.out","w",stdout); int subtask,n; //cin >> subtask; cin >> n; for(int i=1;i<=n;i++){ int p; cin >> p; graph[i].push_back(p); graph[p].push_back(i); } for(int i=1;i<=n;i++){ cin >> c[i]; order[i]=i; } sort(order+1,order+n+1,cmp); vector<vector<int>> group(n+1); vector<pair<int,int>> root; int mp[n+1]={0}; for(int i=1;i<=n;i++){ if(!vis[i]){ sz=0; DFS(i); group[sz].push_back(i); mp[sz]++; } } int limit=1; for(int i=1;i<=n;i++){ if(mp[i]==0){ continue; } base[m]=mp[i]+1; cnt[m]=i; m++; limit*=(mp[i]+1); } pro[m-1]=1; for(int i=m-2;i>=0;i--){ pro[i]=pro[i+1]*base[i+1]; } for(int x=0;x<limit;x++){ DP[x]=1e9; trace[x]=-1; } DP[0]=0; for(int l=1;l<=n;l++){ cost[l][l]=0; for(int r=l+1;r<=n;r++){ cost[l][r]=cost[l][r-1]; if(l+1==r){ cost[l][r]=c[order[r]]-c[order[l]]; } else{ cost[l][r]=max(cost[l][r],c[order[r]]-c[order[r-2]]); } } } for(int x=0;x+1<limit;x++){ vector<int> c=decode(x); int l=1; for(int i=0;i<m;i++){ l+=(c[i]*cnt[i]); } for(int i=0;i<m;i++){ if(c[i]+1<base[i]){ if(DP[x+pro[i]]>max(DP[x],cost[l][l+cnt[i]-1])){ DP[x+pro[i]]=max(DP[x],cost[l][l+cnt[i]-1]); trace[x+pro[i]]=i; } } } } cout << DP[limit-1] << endl; vector<int> p; int x=limit-1; while(x>0){ p.push_back(cnt[trace[x]]); x-=pro[trace[x]]; } memset(vis,false,sizeof(vis)); reverse(p.begin(),p.end()); int l=1; for(int i=0;i<p.size();i++){ idx[group[p[i]].back()]=l; getans(group[p[i]].back(),l,l+p[i]-1); l+=p[i]; group[p[i]].pop_back(); } for(int i=1;i<=n;i++){ idx[i]=order[idx[i]]; } for(int i=1;i<=n;i++){ cout << c[idx[i]] << ' '; } cout << endl; }
#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...
#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...