Submission #559147

#TimeUsernameProblemLanguageResultExecution timeMemory
559147groshiJust Long Neckties (JOI20_ho_t1)C++17
100 / 100
132 ms15628 KiB
#include<iostream>
#include<vector>
#include<algorithm>
#include<utility>
using namespace std;
int t[300000];
int drzewo[1000000];
int drzewo2[1000000];
int pot=1;
int wynik[300000];
int a[300000];
int b[300000];
vector<pair<int,int> > Q;
vector<int> Q2;
int zap1(int x,int y)
{
    if(x>y)
        return 0;
    x+=pot;
    y+=pot;
    int wynik=0;
    wynik=max(drzewo[x],drzewo[y]);
    while(x/2!=y/2)
    {
        if(x%2==0)
            wynik=max(wynik,drzewo[x+1]);
        if(y%2==1)
            wynik=max(wynik,drzewo[y-1]);
        x/=2;
        y/=2;
    }
    return wynik;
}
int zap2(int x,int y)
{
    if(x>y)
        return 0;
    x+=pot;
    y+=pot;
    int wynik=0;
    wynik=max(drzewo2[x],drzewo2[y]);
    while(x/2!=y/2)
    {
        if(x%2==0)
            wynik=max(wynik,drzewo2[x+1]);
        if(y%2==1)
            wynik=max(wynik,drzewo2[y-1]);
        x/=2;
        y/=2;
    }
    return wynik;
}
int main()
{
    cin.tie(0);
    cout.tie(0);
    ios_base::sync_with_stdio(0);
    int n;
    cin>>n;
    while(pot<=n+1)
        pot*=2;
    pot--;
    for(int i=1;i<=n+1;i++)
    {
        cin>>a[i];
        Q.push_back({a[i],i});
    }
    sort(Q.begin(),Q.end());
    for(int i=0;i<n;i++)
    {
        cin>>b[i];
        Q2.push_back(b[i]);
    }
    sort(Q2.begin(),Q2.end());
    for(int i=1;i<=n;i++)
        b[i]=Q2[i-1];
    for(int i=1;i<=n+1;i++)
    {
        //cout<<a[Q[i-1].second]<<" "<<b[i-1]<<" "<<b[i]<<"\n";
        if(i<=n)
            drzewo[i+pot]=a[Q[i-1].second]-b[i];
        if(i>1)
            drzewo2[i+pot]=a[Q[i-1].second]-b[i-1];
    }
    for(int i=pot;i>=1;i--)
        drzewo[i]=max(drzewo[i*2],drzewo[i*2+1]);
    for(int i=pot;i>=1;i--)
        drzewo2[i]=max(drzewo2[i*2],drzewo2[i*2+1]);
    for(int i=1;i<=n+1;i++)
    {
        //cout<<"na lewo "<<zap1(1,i-1)<<" "<<zap2(i+1,n)<<"\n";
        //cout<<"usuwam "<<Q[i-1].second<<"\n";
        wynik[Q[i-1].second]=max(zap1(1,i-1),zap2(i+1,n+1));
        wynik[Q[i-1].second]=max(wynik[Q[i-1].second],0);
    }
    for(int i=1;i<=n+1;i++)
        cout<<wynik[i]<<" ";
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...