Submission #1109436

#TimeUsernameProblemLanguageResultExecution timeMemory
1109436LudisseyNile (IOI24_nile)C++17
100 / 100
90 ms21076 KiB
#include "nile.h" #include <bits/stdc++.h> #define int long long #define sz(a) (int)a.size() #define all(a) a.begin(), a.end() #define rall(a) a.rbegin(), a.rend() using namespace std; vector<int> parent; vector<int> sz; vector<int> mnDEF; vector<pair<int,pair<int,int>>> _a; vector<int> mnEV; vector<int> mnUV; vector<pair<int,int>> mnBORDER; vector<int> mn; int sm=0; int getParent(int x){ if(parent[x]==x) return x; return parent[x]=getParent(parent[x]); } void unite(int a, int b){ a=getParent(a); b=getParent(b); if(a==b) return; parent[b]=a; if(sz[a]%2) sm-=mn[a]; if(sz[b]%2) sm-=mn[b]; if(sz[a]%2){ mnEV[a]=min(mnEV[a], mnUV[b]); mnUV[a]=min(mnUV[a], mnEV[b]); }else{ mnEV[a]=min(mnEV[a], mnEV[b]); mnUV[a]=min(mnUV[a], mnUV[b]); } mnBORDER[a].second=mnBORDER[b].second; sz[a]+=sz[b]; mnDEF[a]=min(mnDEF[a],mnDEF[b]); mn[a]=min(mnDEF[a],min(mnEV[a],min(mnBORDER[a].first,mnBORDER[a].second))); if(sz[a]%2) sm+=mn[a]; } void addMN(int x){ int p=getParent(x); mnDEF[p]=min(mnDEF[p],(_a[x].second.first-_a[x].second.second)); if(sz[p]%2) sm-=mn[p]; mn[p]=min(mn[p],mnDEF[p]); if(sz[p]%2) sm+=mn[p]; } std::vector<int> calculate_costs(std::vector<signed> W, std::vector<signed> A, std::vector<signed> B, std::vector<signed> E) { int q = sz(E); int n=sz(W); mn.resize(n,1e17); sz.resize(n); parent.resize(n); mnDEF.resize(n,1e17); mnEV.resize(n,1e17); mnUV.resize(n,1e17); mnBORDER.resize(n,{1e17,1e17}); vector<pair<int,int>> e(q); _a.resize(n); for (int i = 0; i < q; i++) e[i]={E[i],i}; for (int i = 0; i < n; i++) _a[i]={W[i],{A[i],B[i]}}; sort(all(_a)); sort(all(e)); vector<pair<int,int>> df(n-1); vector<pair<int,int>> df2(n-2); for (int i = 0; i < n-1; i++) df[i]={_a[i+1].first-_a[i].first,i}; for (int i = 0; i < n-2; i++) df2[i]={_a[i+2].first-_a[i].first,i}; sm=0; for (int i = 0; i < n; i++) { sm+=_a[i].second.first; sz[i]=1; parent[i]=i; mn[i]=_a[i].second.first-_a[i].second.second; mnEV[i]=_a[i].second.first-_a[i].second.second; mnBORDER[i]={_a[i].second.first-_a[i].second.second,_a[i].second.first-_a[i].second.second}; } sort(all(df)); sort(all(df2)); std::vector<int> R(q, 0); int j=0; int j2=0; for (int i = 0; i < q; i++) { while(j<n-1){ if(df[j].first>e[i].first) break; unite(df[j].second,df[j].second+1); j++; } while(j2<n-2){ if(df2[j2].first>e[i].first) break; addMN(df2[j2].second+1); j2++; } R[e[i].second]=sm; } return R; }
#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...