제출 #1181855

#제출 시각아이디문제언어결과실행 시간메모리
1181855AntaresCandies (JOI18_candies)C++20
100 / 100
232 ms19912 KiB
/**
Avem maximul la un pas. Pt a alege un nou element, Trebuie sa extindem o secventa. Tinem un set cu extinderile.
**/
#include <iostream>
#include <set>
#define dim 200000
#define ppp pair <long long,pair <int,int>>
#define cost first
#define l second.first
#define r second.second
using namespace std;
set <ppp> s;
set <ppp>::iterator it;
ppp pos[dim+1];
int n,v[dim+1];
long long ss[dim+1];
void init ()
{
    cin>>n;
    for (int i=1; i<=n; i++)
    {
        cin>>v[i];
        if (i==1)
            ss[1]=v[1];
        else
            ss[i]=ss[i-2]+v[i];
        pos[i]=make_pair (v[i],make_pair (i,i));
        s.insert (make_pair (v[i],make_pair (i,i)));
    }
}
long long get_cost (int st,int dr)
{
    return (ss[dr]-ss[st]-v[dr])-(ss[dr-1]-ss[st+1]+v[st+1]);
}
void solve ()
{
    long long sol=0;
    for (int i=1; i<=(n+1)/2; i++)
    {
        it=s.end (),it--;
        ppp elem=*it;
        sol+=elem.first;
        elem.l--;
        elem.r++;
        s.erase (it);
        if (s.find (pos[elem.l])!=s.end ())
            s.erase (s.find (pos[elem.l]));
        if (s.find (pos[elem.r])!=s.end ())
            s.erase (s.find (pos[elem.r]));
        ppp nelem=make_pair (pos[elem.l].cost+pos[elem.r].cost+get_cost (elem.l,elem.r),make_pair (pos[elem.l].l,pos[elem.r].r));
        if (nelem.l>0&&nelem.r<=n)
            s.insert (nelem);
        pos[nelem.l]=nelem,pos[nelem.r]=nelem;
        cout<<sol<<"\n";
    }
}
int main ()
{
    init ();
    solve ();
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...