Submission #1357059

#TimeUsernameProblemLanguageResultExecution timeMemory
1357059biserailievaGift Boxes (EGOI25_giftboxes)C++20
40 / 100
473 ms49300 KiB
#include <bits/stdc++.h>
using namespace std;

int main()
{
    int n, t;
    cin>>t>>n;
    set<int>st;
    int A[n];
    int L=-1, R=-1;
    bool vtor=true;
    map<int, int>F;
    bool tri=false;
    int c2=0;
    for(int i=0;i<n;i++)
    {
        cin>>A[i];
        F[A[i]]++;
        st.insert(A[i]);
        if(n==t+1 && st.size()<i+1 && L==-1 && R==-1)
        {
            L=i;
            R=i;
        }
        if(i<n/2 && st.size()<i+1)
        {
            vtor=false;
        }
        if(F[A[i]]==3)
        {
            tri=true;
        }
        if(F[A[i]]==2)
        {
            c2++;
        }
    }
    if(tri)
    {
        map<int, int>f2;
        for(int i=0;i<n;i++)
        {
            f2[A[i]]++;
            if(f2[A[i]]==2 && F[A[i]]>2)
            {
                L=i;
                break;
            }
        }
        map<int, int>f3;
        for(int i=n-1;i>=0;i--)
        {
            f3[A[i]]++;
            if(f3[A[i]]==2 && F[A[i]]>2)
            {
                R=i;
                break;
            }
        }
        map<int, int>f4;
        for(int i=0;i<L;i++)
        {
            f4[A[i]]++;
            if(f4[A[i]]==2)
            {
                L=i;
                break;
            }
        }
        map<int, int>f5;
        for(int i=n-1;i>R;i--)
        {
            f5[A[i]]++;
            if(f5[A[i]]==2)
            {
                R=i;
            }
        }
        map<int, int>f6;
        vector<pair<int, int>>V(t+1, pair<int, int>(-1, -1));
        for(int i=0;i<L;i++)
        {
            f6[A[i]]++;
            V[A[i]].first=i;
        }
        for(int i=n-1;i>R;i--)
        {
            f6[A[i]]++;
            if(f6[A[i]]==2)
            {
                V[A[i]].second=i;
                if(L-V[A[i]].first>V[A[i]].second-R)
                {
                    R=V[A[i]].second;
                }
                else
                {
                    L=V[A[i]].first;
                }
            }
        }
        cout<<L<<' '<<R<<endl;
    }
    else if(n==t+1)
    {
        cout<<L<<' '<<R<<endl;
    }
    else if(vtor && n==2*t)
    {
        cout<<0<<' '<<n/2-1<<endl;
    }
    else if(!vtor && n==2*t)
    {
        int l=n/2;
        int r=n;
        while(l<=r)
        {
            vector<int> freq(t, 0);
            int mid=(l+r)/2;
            int cnt=0;
            bool valid=false;
            for(int i=0;i<mid;i++)
            {
                freq[A[i]]++;
                if(freq[A[i]]==1)
                {
                    cnt++;
                }
            }
            if(cnt==n/2)
            {
                valid=true;
            }
            if(valid)
            {
                L=0;
                R=mid-1;
                r=mid-1;
            }
            else
            {
                for (int j = mid; j < n; j++)
                {
                    if(freq[A[j-mid]]==1)
                    {
                        cnt--;
                    }
                    freq[A[j-mid]]--;
                    freq[A[j]]++;
                    if(freq[A[j]]==1)
                    {
                        cnt++;
                    }
                    if(cnt==n/2)
                    {
                        valid=true;
                    }
                    if(valid)
                    {
                        L=j-mid+1;
                        R=j;
                        r=mid-1;
                        break;
                    }
                }
                if(!valid)
                {
                    l=mid+1;
                }
            }
        }
        cout<<L<<' '<<R<<endl;
    }
    else
    {
        int l=c2, r=n;
        L=0;
        R=n-1;
        while(l<=r)
        {
            vector<int>freq(t+1, 0);
            int mid=(l+r)/2;
            int cnt=0;
            bool valid=false;
            for(int i=0;i<mid;i++)
            {
                freq[A[i]]++;
                if(freq[A[i]]==1 && F[A[i]]==2)
                {
                    cnt++;
                }
            }
            if(cnt==c2)
            {
                valid=true;
            }
            if(valid)
            {
                L=0;
                R=mid-1;
                r=mid-1;
            }
            else
            {
                for(int j=mid;j<n;j++)
                {
                    if(freq[A[j-mid]]==1 && F[A[j-mid]]==2)
                    {
                        cnt--;
                    }
                    freq[A[j-mid]]--;
                    freq[A[j]]++;
                    if(freq[A[j]]==1 && F[A[j]]==2)
                    {
                        cnt++;
                    }
                    if(cnt==c2)
                    {
                        valid=true;
                    }
                    if(valid)
                    {
                        L=j-mid+1;
                        R=j;
                        r=mid-1;
                        break;
                    }
                }
                if(!valid)
                {
                    l=mid+1;
                }
            }
        }
        cout<<L<<' '<<R<<endl;
    }
    return 0;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...