Submission #1305302

#TimeUsernameProblemLanguageResultExecution timeMemory
1305302nicknamedtwiceNile (IOI24_nile)C++20
100 / 100
68 ms11576 KiB
#include "nile.h"
#include <bits/stdc++.h>
using namespace std; using ll=long long;
static constexpr ll INF=(ll)4e18;
vector<long long> calculate_costs(
    vector<int> W, vector<int> A,
    vector<int> B, vector<int> E
){
 int N=W.size(),Q=E.size();
 vector<int>o(N); iota(o.begin(),o.end(),0);
 sort(o.begin(),o.end(),[&](int i,int j){return W[i]<W[j];});
 vector<ll>w(N),C(N); ll base=0;
 for(int i=0;i<N;i++){int id=o[i];w[i]=W[id];C[i]=(ll)A[id]-B[id];base+=B[id];}
 vector<unsigned long long>ev;
 for(int i=0;i+1<N;i++)ev.push_back((w[i+1]-w[i])<<32|i);
 for(int i=0;i+2<N;i++)ev.push_back((w[i+2]-w[i])<<32|(1ull<<31)|i);
 sort(ev.begin(),ev.end());
 vector<int>qi(Q); iota(qi.begin(),qi.end(),0);
 sort(qi.begin(),qi.end(),[&](int i,int j){return E[i]<E[j];});
 vector<int>p(N),sz(N,1); vector<ll>a(N),b(N,INF),c(N,INF);
 for(int i=0;i<N;i++)p[i]=i,a[i]=C[i];
 auto f=[&](int x){while(p[x]!=x)p[x]=p[p[x]],x=p[x];return x;};
 auto con=[&](int r){return(sz[r]&1)?min(a[r],c[r]):0ll;};
 ll extra=accumulate(C.begin(),C.end(),0ll);
 auto uni=[&](int x,int y){
  x=f(x);y=f(y);if(x==y)return;if(x>y)swap(x,y);
  extra-=con(x)+con(y); ll ne,no;
  if(sz[x]&1)ne=min(a[x],b[y]),no=min(b[x],a[y]);
  else ne=min(a[x],a[y]),no=min(b[x],b[y]);
  p[y]=x; sz[x]+=sz[y]; a[x]=ne; b[x]=no; c[x]=min(c[x],c[y]);
  extra+=con(x);
 };
 auto mid=[&](int i){
  int r=f(i); ll o=con(r); c[r]=min(c[r],C[i]); extra+=con(r)-o;
 };
 vector<ll>ans(Q); int ptr=0;
 for(int id:qi){
  while(ptr<(int)ev.size()&&(ev[ptr]>>32)<=E[id]){
   int i=ev[ptr]&0x7fffffff;
   ((ev[ptr]>>31)&1)?mid(i+1):uni(i,i+1); ptr++;
  }
  ans[id]=base+extra;
 }
 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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...