제출 #1228148

#제출 시각아이디문제언어결과실행 시간메모리
1228148PVM_pvm나일강 (IOI24_nile)C++20
100 / 100
144 ms20396 KiB
#include<bits/stdc++.h>
using namespace std;
#define MAXN 100'007
struct artef
{
    long long w,a,b;
} ar[MAXN];
int n,Q;
bool cmp(artef a, artef b)
{
    return a.w<b.w;
}
struct event
{
    int ind;
    long long rzl;
    bool edno;
};
bool cmp2(event a, event b)
{
    if (a.rzl==b.rzl) return a.edno>b.edno;
    return a.rzl<b.rzl;
}
long long smetka=0;
long long seg[4*MAXN][3];
void Initialise(int ind, int l, int r)
{
    if (l==r)
    {
        seg[ind][2]=LONG_LONG_MAX;
        seg[ind][l%2]=ar[l].a-ar[l].b;
        seg[ind][1-l%2]=LONG_LONG_MAX;
        //cout<<l<<" "<<(l%2)<<" "<<(1-l%2)<<" "<<seg[ind][l%2]<<" "<<ind<<" t\n";
        return;
    }
    int mid=(l+r)/2;
    Initialise(ind*2,l,mid);
    Initialise(ind*2+1,mid+1,r);
    seg[ind][0]=min(seg[ind*2][0],seg[ind*2+1][0]);
    seg[ind][1]=min(seg[ind*2][1],seg[ind*2+1][1]);
    seg[ind][2]=min(seg[ind*2][2],seg[ind*2+1][2]);
}
void Update(int ind, int l, int r, int pos, long long st, int id)
{
    if (l==r)
    {
        seg[ind][id]=st;
        return;
    }
    int mid=(l+r)/2;
    if (pos<=mid) Update(ind*2,l,mid,pos,st,id);
    else Update(ind*2+1,mid+1,r,pos,st,id);
    seg[ind][id]=min(seg[ind*2][id],seg[ind*2+1][id]);
}
long long mnn;
void Query(int ind, int l, int r, int ql, int qr, int id)
{
    if (ql<=l && qr>=r)
    {
        //if (ql==3 && qr==3) cout<<ind<<" "<<l<<" "<<r<<" "<<seg[ind][id]<<"\n";
        mnn=min(mnn,seg[ind][id]);
        return;
    }
    int mid=(l+r)/2;
    if (ql<=mid) Query(ind*2,l,mid,ql,qr,id);
    if (qr>=mid+1) Query(ind*2+1,mid+1,r,ql,qr,id);
}

int par[MAXN];
int gol[MAXN];
int lqv[MAXN];
int fat(int x)
{
    if (par[x]==x) return x;
    par[x]=fat(par[x]);
    return par[x];
}
long long pref[MAXN];
long long cost(int l, int r)
{
    //cout<<l<<" "<<r<<"\n";
    long long suma=pref[r];
    if (l!=0) suma-=pref[l-1];
    //cout<<suma<<"\n";
    if ((r-l+1)%2==1)
    {
        mnn=LONG_LONG_MAX;
        Query(1,0,n-1,l,r,l%2);
        Query(1,0,n-1,l,r,2);
        //cout<<mnn<<" "<<(l%2)<<"x\n";
        suma+=mnn;
    }
    //cout<<suma<<"\n";
    return suma;
}
void obedini(int x)
{
    ///obedinqvame x i x+1
    int y=fat(x);
    int z=fat(x+1);
    smetka-=cost(x-gol[y]+1,x);
    smetka-=cost(x+1,x+gol[z]);
    smetka+=cost(x-gol[y]+1,x+gol[z]);
    gol[z]+=gol[y];
    lqv[z]=lqv[y];
    par[y]=z;
}
void uvelichi(int x)
{
    x++;
    int y=fat(x);
    //cout<<lqv[y]<<" "<<gol[y]<<" dada\n";
    smetka-=cost(lqv[y],lqv[y]+gol[y]-1);
    //cout<<"pochva "<<x<<"\n";
    Update(1,0,n-1,x,ar[x].a-ar[x].b,2);
    //cout<<"svyrshi "<<x<<"\n";
    smetka+=cost(lqv[y],lqv[y]+gol[y]-1);
}
vector<long long> calculate_costs(vector<int> W, vector<int> A, vector<int> B, vector<int> E)
{
    n=W.size();
    Q=E.size();
    for (int q=0;q<n;q++)
    {
        ar[q]={W[q],A[q],B[q]};
    }
    sort(ar,ar+n,cmp);
    vector<event> syb;
    for (int q=0;q<n-1;q++)
    {
        syb.push_back({q,ar[q+1].w-ar[q].w,1});
    }
    for (int q=0;q<n-2;q++)
    {
        syb.push_back({q,ar[q+2].w-ar[q].w,0});
    }
    sort(syb.begin(),syb.end(),cmp2);
    vector<pair<int,int>> qu;
    for (int q=0;q<Q;q++)
    {
        qu.push_back({E[q],q});
    }
    sort(qu.begin(),qu.end());
    pref[0]=ar[0].b;
    for (int q=1;q<n;q++) pref[q]=pref[q-1]+ar[q].b;
    for (int q=0;q<n;q++) smetka+=ar[q].a;
    //cout<<smetka<<"\n";
    for (int q=0;q<n;q++) par[q]=q;
    for (int q=0;q<n;q++) gol[q]=1;
    for (int q=0;q<n;q++) lqv[q]=q;
    Initialise(1,0,n-1);
    vector<long long> otg(Q);
    int cure=0;
    for (int curq=0;curq<Q;curq++)
    {
        while (cure<syb.size() && syb[cure].rzl<=qu[curq].first)
        {
            //cout<<syb[cure].ind<<"\n";
            if (syb[cure].edno)
            {
                obedini(syb[cure].ind);
            }
            else
            {
                uvelichi(syb[cure].ind);
            }
            cure++;
        }
        otg[ qu[curq].second ]=smetka;
    }
    return otg;
}
#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...