Submission #1191907

#TimeUsernameProblemLanguageResultExecution timeMemory
1191907prideliqueeeWatching (JOI13_watching)C++20
0 / 100
1 ms324 KiB
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define f first
#define s second
int a[3010];
int mn[12000];
struct st
{
    int ex,one,two;
    bool operator <(const st&o) const
    {
        if(ex+one+two==o.ex+o.one+o.two)
        return two>o.two;
        return ex+one+two<o.ex+o.one+o.two;
    }
};
void build(int l,int r,int i)
{
    if(l==r)
    {
        mn[i]=a[l];
        return;
    }
    int mid=(l+r)/2;
    build(l,mid,i*2);
    build(mid+1,r,i*2+1);
    mn[i]=min(mn[i*2],mn[i*2+1]);
}
int query(int l,int r,int i,int val)
{
    if(l==r)
    return l;
    int mid=(l+r)/2;
    if(mn[i*2+1]<=val)
    return query(mid+1,r,i*2+1,val);
    else
    return query(l,mid,i*2,val);
}
signed main()
{
    int n,p,q;
    cin>>n>>p>>q;
    for(int i=1;i<=n;i++)
    cin>>a[i];
    a[0]=0;
    sort(a+1,a+n+1);
    build(0,n,1);
    int l=1,r=10;
    while(l<r)
    {
        int mid=(l+r)/2;
        st dp[n+1][2];
        for(int i=0;i<=n;i++)
        dp[i][0]=dp[i][1]={0,0,0};
        for(int i=1;i<=n;i++)
        {
            int index1=query(0,n,1,max((int)0,a[i]-mid));
            int index2=query(0,n,1,max((int)0,a[i]-mid*2));
            st p1=dp[index1][0],p2=dp[index1][1];
            p1.one++;
            p2.one++;
            if(p1<p2)
            dp[i][0]=p1;
            else
            dp[i][0]=p2;
            p1=dp[index2][0],p2=dp[index2][1];
            p1.two+=2;
            p2.two+=2;
            if(p1<p2)
            dp[i][1]=p1;
            else
            dp[i][1]=p2;
            /*cout<<a[i]-mid<<" "<<a[i]-mid*2<<endl;
            cout<<index1<<' '<<index2<<endl;
            cout<<p1.ex<<" "<<p1.one<<" "<<p1.two<<'\n';
            cout<<p2.ex<<" "<<p2.one<<" "<<p2.two<<'\n';
            cout<<dp[i].ex<<" "<<dp[i].one<<" "<<dp[i].two<<'\n';
            cout<<endl;*/
        }
        int b=0;
        int ex=dp[n][0].ex,one=dp[n][0].one,two=dp[n][0].two;
        int pp=p,qq=q;
        two/=2;
        if(two<=qq)
        {
            qq-=two;
            two=0;
        }
        else
        {
            two-=qq;
            qq=0;
            two*=2;
        }
        if(two+one+ex<=qq+pp)
        b=1;
        ex=dp[n][1].ex,one=dp[n][1].one,two=dp[n][1].two;
        pp=p,qq=q;
        two/=2;
        if(two<=qq)
        {
            qq-=two;
            two=0;
        }
        else
        {
            two-=qq;
            qq=0;
            two*=2;
        }
        if(two+one+ex<=qq+pp)
        b=1;
        if(b)
        r=mid;
        else
        l=mid+1;
    }
    cout<<l;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...