제출 #883207

#제출 시각아이디문제언어결과실행 시간메모리
883207andrei_boaca모임들 (IOI18_meetings)C++17
19 / 100
5515 ms316320 KiB
#include "meetings.h"
#include <bits/stdc++.h>
//#include "grader.cpp"
using namespace std;
typedef long long ll;
int iteration;
ll n,q,v[750005],rmq[21][750005];
ll loga[750005];
vector<ll> sol;
ll best(ll i,ll j)
{
    if(v[i]>v[j])
        return i;
    if(v[j]>v[i])
        return j;
    if(iteration==1)
        return max(i,j);
    else
        return min(i,j);
}
ll getbest(ll l,ll r)
{
    ll lg=loga[r-l+1];
    return best(rmq[lg][l],rmq[lg][r-(1<<lg)+1]);
}
struct query
{
    ll r,ind,cst;
};
vector<query> who[750005];
struct interv
{
    ll st,dr,a,b;
};
struct node
{
    node *l;
    node *r;
    deque<interv> s;
    ll lazy;
    node()
    {
        lazy=0;
        l=NULL;
        r=NULL;
    }
};
ll eval(node *me, ll poz)
{
    ll st=0;
    ll dr=me->s.size();
    dr--;
    while(st<=dr)
    {
        ll mij=(st+dr)/2;
        if(me->s[mij].st>poz)
        {
            dr=mij-1;
            continue;
        }
        if(me->s[mij].dr<poz)
        {
            st=mij+1;
            continue;
        }
        ll val=me->s[mij].a*poz+me->s[mij].b+me->lazy;
        return val;
    }
}
node* build(ll l,ll r)
{
    ll poz=getbest(l,r);
    ll hv=v[poz];
    node *nod = new node;
    if(l<=poz-1)
        nod->l=build(l,poz-1);
    if(r>=poz+1)
        nod->r=build(poz+1,r);
    ll valmij=0;
    if(nod->l==NULL)
    {
        valmij=v[poz];
        nod->l=new node;
    }
    else
        valmij=eval(nod->l,poz-1)+v[poz];
    nod->l->s.push_back({poz,poz,0,valmij-nod->l->lazy});
    ll off=hv*(poz-l+1);
    if(nod->r==NULL)
    {
        nod=nod->l;
        for(auto i:who[l])
        {
            ll rgt=i.r;
            ll ind=i.ind;
            ll cst=i.cst;
            if(rgt<=r)
            {
                ll val=eval(nod,rgt)+cst;
                sol[ind]=min(sol[ind],val);
            }
        }
        return nod;
    }
    valmij-=hv*poz;
    nod->r->lazy+=off;
    while(!nod->r->s.empty())
    {
        interv a=nod->r->s.front();
        ll p=a.dr;
        ll val1=valmij+hv*p;
        ll val2=a.a*p+a.b+nod->r->lazy;
        if(val1<=val2)
        {
            nod->r->s.pop_front();
            continue;
        }
        else
        {
            ll st=a.st;
            ll dr=a.dr;
            ll j=st-1;
            while(st<=dr)
            {
                ll mij=(st+dr)/2;
                val1=valmij+hv*mij;
                val2=a.a*mij+a.b+nod->r->lazy;
                if(val1<=val2)
                {
                    j=mij;
                    st=mij+1;
                }
                else
                    dr=mij-1;
            }
            nod->r->s.pop_front();
            a.st=j+1;
            nod->r->s.push_front(a);
            interv add={poz+1,j,hv,valmij-nod->r->lazy};
            if(add.st<=add.dr)
                nod->r->s.push_front(add);
            break;
        }
    }
    if(nod->r->s.empty())
        nod->r->s.push_back({poz+1,r,hv,valmij-nod->r->lazy});
    node *rez;
    if(nod->l->s.size()<nod->r->s.size())
    {
        ll dif=nod->r->lazy-nod->l->lazy;
        rez=nod->r;
        while(!nod->l->s.empty())
        {
            interv a=nod->l->s.back();
            nod->l->s.pop_back();
            a.b-=dif;
            rez->s.push_front(a);
        }
    }
    else
    {
        ll dif=nod->l->lazy-nod->r->lazy;
        rez=nod->l;
        while(!nod->r->s.empty())
        {
            interv a=nod->r->s.front();
            nod->r->s.pop_front();
            a.b-=dif;
            rez->s.push_back(a);
        }
    }
    for(auto i:who[l])
    {
        ll rgt=i.r;
        ll ind=i.ind;
        ll cst=i.cst;
        if(rgt<=r)
        {
            ll val=eval(rez,rgt)+cst;
            sol[ind]=min(sol[ind],val);
        }
    }
    /*if(iteration==2)
    {
        cout<<l<<' '<<r<<' '<<rez->lazy<<'\n';
        for(auto i:rez->s)
            cout<<i.st<<' '<<i.dr<<' '<<i.a<<' '<<i.b<<'\n';
        cout<<'\n';
    }*/
    return rez;
}
vector<long long> minimum_costs(vector<int> H, vector<int> L, vector<int> R)
{
    n=H.size();
    q=L.size();
    sol.resize(q);
    iteration=1;
    for(int i=1;i<=n;i++)
    {
        v[i]=H[i-1];
        for(int bit=0;bit<=20;bit++)
            if((1<<bit)<=i)
                loga[i]=bit;
    }
    for(int i=0;i<q;i++)
    {
        sol[i]=1e17;
        L[i]++;
        R[i]++;
    }
    for(int i=n;i>=1;i--)
    {
        rmq[0][i]=i;
        for(int j=1;j<=20;j++)
        {
            rmq[j][i]=rmq[j-1][i];
            int poz=i+(1<<(j-1));
            if(poz<=n)
                rmq[j][i]=best(rmq[j][i],rmq[j-1][poz]);
        }
    }
    for(int i=0;i<q;i++)
    {
        ll poz=getbest(L[i],R[i]);
        ll cst=(poz-L[i]+1)*v[poz];
        if(poz+1<=R[i])
            who[poz+1].push_back({R[i],i,cst});
        else
            sol[i]=min(sol[i],cst);
    }
    build(1,n);
    iteration=2;
    reverse(v+1,v+n+1);
    for(int i=1;i<=n;i++)
        who[i].clear();
    for(int i=0;i<q;i++)
    {
        L[i]=n-L[i]+1;
        R[i]=n-R[i]+1;
        swap(L[i],R[i]);
    }
    for(int i=n;i>=1;i--)
    {
        rmq[0][i]=i;
        for(int j=1;j<=20;j++)
        {
            rmq[j][i]=rmq[j-1][i];
            int poz=i+(1<<(j-1));
            if(poz<=n)
                rmq[j][i]=best(rmq[j][i],rmq[j-1][poz]);
        }
    }
    for(int i=0;i<q;i++)
    {
        ll lft=L[i];
        ll rgt=R[i];
        ll poz=getbest(L[i],R[i]);
        ll cst=(poz-L[i]+1)*v[poz];
        if(poz+1<=R[i])
            who[poz+1].push_back({R[i],i,cst});
        else
            sol[i]=min(sol[i],cst);
    }
    build(1,n);
    return sol;
}

컴파일 시 표준 에러 (stderr) 메시지

meetings.cpp: In function 'std::vector<long long int> minimum_costs(std::vector<int>, std::vector<int>, std::vector<int>)':
meetings.cpp:255:12: warning: unused variable 'lft' [-Wunused-variable]
  255 |         ll lft=L[i];
      |            ^~~
meetings.cpp:256:12: warning: unused variable 'rgt' [-Wunused-variable]
  256 |         ll rgt=R[i];
      |            ^~~
meetings.cpp: In function 'll eval(node*, ll)':
meetings.cpp:69:1: warning: control reaches end of non-void function [-Wreturn-type]
   69 | }
      | ^
#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...