제출 #1149102

#제출 시각아이디문제언어결과실행 시간메모리
1149102RaresNile (IOI24_nile)C++20
100 / 100
75 ms16572 KiB
#include <bits/stdc++.h>
#include "nile.h"

using namespace std;
/*ifstream fin ("date.in");
ofstream fout ("date.out");
#define cin fin
#define cout fout*/

const int MAXN=1e5+10;
typedef long long ll;
const ll INF=1e18;

struct query{
    int x,i;
}q[MAXN];
bool cmp3 (query a, query b){
    return a.x<b.x;
}

struct artefact{
    int w,c1,c2;
}a[MAXN];
bool cmp (artefact x, artefact y){
    return x.w<y.w;
}

struct dif{
    int x,l,r;
};
vector<dif> d;
bool cmp2 (dif a, dif b){
    return a.x<b.x;
}


int n,m,tata[MAXN],s[MAXN];
ll ans[MAXN],rez,sumc2[MAXN],dmin[2][MAXN],sum[MAXN],l[MAXN],dmine[2][MAXN];

int radacina (int x){
    if (tata[x]==x) return x;
    return tata[x]=radacina (tata[x]);
}
void unire (int x, int y){
    x=radacina (x),y=radacina (y);

    ll dcrt[2],dcrte[2];
    if (s[x]%2){
        dcrt[0]=min (dmin[0][x],dmin[1][y]);
        dcrt[1]=min (dmin[1][x],dmin[0][y]);

        dcrte[0]=min (dmine[0][x],dmine[1][y]);
        dcrte[1]=min (dmine[1][x],dmine[0][y]);
    }
    else{
        dcrt[0]=min (dmin[0][x],dmin[0][y]);
        dcrt[1]=min (dmin[1][x],dmin[1][y]);

        dcrte[0]=min (dmine[0][x],dmine[0][y]);
        dcrte[1]=min (dmine[1][x],dmine[1][y]);
    }
    if (s[x]<s[y]) swap (x,y);
    rez-=sum[x];
    rez-=sum[y];
    l[x]=min (l[x],l[y]);
    s[x]+=s[y];
    tata[y]=x;
    sumc2[x]+=sumc2[y];
    dmin[0][x]=dcrt[0];
    dmin[1][x]=dcrt[1];
    dmine[0][x]=dcrte[0];
    dmine[1][x]=dcrte[1];

    if (s[x]%2==0) sum[x]=sumc2[x];
    else sum[x]=sumc2[x]+min (dmin[1][x],dmine[0][x]);

    rez+=sum[x];
}
void enable (int x){
    int r=radacina (x);

    if ((x-l[r])%2==0) dmine[1][r]=min (dmine[1][r],1LL*a[x].c1-a[x].c2);

    else dmine[0][r]=min (dmine[0][r],1LL*a[x].c1-a[x].c2);
    rez-=sum[r];
    if (s[r]%2) sum[r]=sumc2[r]+min (dmin[1][r],dmine[0][r]);
    rez+=sum[r];
}

std::vector<long long> calculate_costs(std::vector<int> W, std::vector<int> A, std::vector<int> B, std::vector<int> E){
    n=W.size ();
    m=E.size ();
    for (int i=0;i<n;++i){
        a[i+1].w=W[i];
        a[i+1].c1=A[i];
        a[i+1].c2=B[i];

    }
    for (int i=0;i<m;++i){
        q[i+1]={E[i],i+1};
    }

    sort (a+1,a+n+1,cmp);

    for (int i=1;i<n;++i){
        d.push_back ({a[i+1].w-a[i].w,i,i+1});
        if (i<n-1) d.push_back ({a[i+2].w-a[i].w,i,i+2});
    }

    sort (d.begin (),d.end (),cmp2);


    sort (q+1,q+m+1,cmp3);

    for (int i=1;i<=n;++i){
        s[i]=1;
        tata[i]=i;
        rez+=a[i].c1;
        sum[i]=a[i].c1;
        sumc2[i]=a[i].c2;
        dmine[0][i]=dmine[1][i]=INF;
        dmin[0][i]=INF;
        dmin[1][i]=a[i].c1-a[i].c2;
        l[i]=i;
    }

    int j=0;

    for (int i=1;i<=m;++i){
        while (j<d.size () and q[i].x>=d[j].x){

            if (d[j].l+1==d[j].r) unire (d[j].l,d[j].r);
            else enable (d[j].l+1);
            j++;
        }
        ans[q[i].i]=rez;
    }

    vector <ll> aux;
    for (int i=1;i<=m;++i){
        aux.push_back (ans[i]);
    }
    return aux;
}

/*signed main()
{
    ios_base::sync_with_stdio (false);
    cin.tie (nullptr);
    vector <int> A,W,B,E;
    int n,q;
    cin >>n;
    for (int i=1;i<=n;++i){
        int x,y,z;
        cin >>x>>y>>z;
        W.push_back (x);
        A.push_back (y);
        B.push_back (z);
    }

    cin >>q;
    for (int i=1;i<=q;++i){
        int x;
        cin >>x;
        E.push_back (x);
    }
    vector <ll> aux=calculate_costs (W,A,B,E);

    for (auto x:aux){
        cout <<x<<'\n';
    }
    return 0;
}*/
/*
15 12 2 10 21
5 4 5 6 3
1 2 2 3 2
5 9 1

5
15 5 1
12 4 2
2 5 2
10 6 3
21 3 2
3
5
9
1
*/
#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...