Submission #1368239

#TimeUsernameProblemLanguageResultExecution timeMemory
1368239po_rag526Nile (IOI24_nile)C++17
100 / 100
147 ms59556 KiB
#include<bits/stdc++.h>
#include"nile.h"
#define MAXN (ll)1e5+5
typedef long long ll;
using namespace std;

//ovaj sam uradio ranije od slanja nego sam ga slao na qoj ac a ne ovde

ll n,q,p[MAXN],v[MAXN],lg[MAXN],c[MAXN],sg[4*MAXN],pb[MAXN];
array<ll,2>e[MAXN],g[MAXN],t[MAXN][25];
array<ll,3> s[MAXN];
vector<ll>r;
ll minq(ll l,ll r,ll j){
    ll o=lg[r-l+1];
    return min(t[l][o][j],t[r-(1<<o)+1][o][j]);
}
void update(ll l,ll r,ll i,ll x,ll u=1){
    if(l>i||r<i||r<l){return;}
    if(l==i&&i==r){
        sg[u]=x;return;
    }
    ll m=(l+r)/2;
    update(l,m,i,x,2*u);
    update(m+1,r,i,x,2*u+1);
    sg[u]=min(sg[2*u],sg[2*u+1]);
}ll query(ll l,ll r,ll tl,ll tr,ll u=1){
    if(tr<l||r<tl||r<l){return 1e18;}
    if(tl<=l&&r<=tr){
        return sg[u];
    }
    ll m=(l+r)/2;
    return min(query(l,m,tl,tr,2*u),query(m+1,r,tl,tr,2*u+1));
}
ll find(ll x){
    return p[x]=(p[x]==x?x:find(p[x]));
}
ll z=0;
void updc(ll a){
    z-=c[a];
    c[a]=pb[g[a][1]]-pb[g[a][0]-1]+(v[a]%2)*min(minq(g[a][0],g[a][1],g[a][0]%2),query(1,n,g[a][0],g[a][1]));
    z+=c[a];
}
void unite(ll a,ll b){
    a=find(a);
    b=find(b);
    if(a==b){return;}
    if(v[a]<v[b]){swap(a,b);}
    v[a]+=v[b];
    z-=c[b];
    p[b]=a;
    g[a]={min(g[a][0],g[b][0]),max(g[a][1],g[b][1])};
    updc(a);
}
void solve(){
  sort(s+1,s+n+1);
  sort(e,e+q);
  for(ll i=1;i<=n;i++){
    update(1,n,i,1e18);
    pb[i]=pb[i-1]+s[i][2];
    p[i]=i;
    c[i]=s[i][1];
    z+=c[i];
    g[i]={i,i};
    v[i]=1;
    t[i][0][i%2]=s[i][1]-s[i][2];
    t[i][0][!(i%2)]=1e18;
  }
  update(1,n,1,s[1][1]-s[1][2]);
  update(1,n,n,s[n][1]-s[n][2]);
  for(ll j=1;j<=lg[n];j++){
    for(ll i=1;i+(1<<(j-1))<=n;i++){
        t[i][j][0]=min(t[i][j-1][0],t[i+(1<<(j-1))][j-1][0]);
        t[i][j][1]=min(t[i][j-1][1],t[i+(1<<(j-1))][j-1][1]);
    }
  }
  priority_queue<array<ll,2>>pq1,pq2;
  for(ll i=1;i<=n-1;i++){
    pq1.push({-s[i+1][0]+s[i][0],i});
  }for(ll i=1;i<=n-2;i++){
    pq2.push({-s[i+2][0]+s[i][0],i});
  }
  for(ll l=0;l<q;l++){
    ll d=e[l][0];
    while(!pq1.empty()&&d>=-(pq1.top())[0]){
        ll i=(pq1.top())[1];pq1.pop();
        unite(i,i+1);
    }while(!pq2.empty()&&d>=-pq2.top()[0]){
        ll i=(pq2.top())[1]+1;pq2.pop();
        update(1,n,i,s[i][1]-s[i][2]);
        updc(find(i));
    }
    r[e[l][1]]=z;
  }
}
std::vector<ll> calculate_costs(std::vector<int> W, std::vector<int> A,
                                       std::vector<int> B, std::vector<int> E) {
  q = (ll)E.size();
  n = (ll)W.size();
  lg[0]=lg[1]=0;
  for(ll i=2;i<=n;i++){
    lg[i]=lg[i/2]+1;
  }
  for(ll i=0;i<n;i++){
    s[i+1]={W[i],A[i],B[i]};
  }for(ll i=0;i<q;i++){
    e[i]={E[i],i};
  }
  r.resize(q,0);
  solve();
  return r;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...