제출 #47846

#제출 시각아이디문제언어결과실행 시간메모리
47846temurbek_khujaevGap (APIO16_gap)C++17
30 / 100
120 ms19552 KiB
#include <bits/stdc++.h>
#include "gap.h"

using namespace std;

typedef long long ll;

ll v[223456];
#define fi first
#define se second

void upmax(ll &x,ll y) {
    x=max(x,y);
}

long long findGap(int T, int n)
{
    ll ans=0;

    if (T==1) {
        int l=0, r=n-1;
        MinMax(0ll,(1ll<<60),&v[0],&v[n-1]);

        for (int i=0;i<n/2;i++) {
            if (l+1==r) break;
            MinMax(v[l]+1,v[r]-1,&v[l+1],&v[r-1]);
            l++;
            r--;
        }

        for (int i=1;i<n;i++) {
            ans=max(ans,v[i]-v[i-1]);
        }
        return ans;
    } else {
        cout<<T<<endl;

        ll L,R;
        MinMax(0ll,(1ll<<60),&L,&R);
        set<pair<ll,pair<ll,ll> > > s;
        s.insert({L-R,{L,R}});
        ll lf=0,rg;

        do {


            ll d=-s.begin()->fi;
            if (d<ans) return ans;


            ll x=s.begin()->se.fi;
            ll y=s.begin()->se.se;
            s.erase(s.begin());
            ll f=d/3;
            ll m1,m2;
         //   cout<<d<< ' '<<x<< ' ' << y<<endl;
            MinMax(x+f,x+f+f,&m1,&m2);

            if (m1==-1) {

                ll mn1,mx1,mn2,mx2;

                MinMax(x+1,x+f-1,&mn1,&mx1);
                MinMax(x+2*f+1,y-1,&mn2,&mx2);


                if (mn1==-1&&mn2==-1)
                    return max(ans,d);

                else {

                    if (mx1!=-1&&mn2!=-1) upmax(ans,mn2-mx1);

                    if(mn1==-1) {
                        upmax(ans,mn2-x);
                    } else {
                        upmax(ans,mn1-x);
                        s.insert({mn1-mx1,{mn1,mx1}});
                        if (mn2!=-1) s.insert({mx1-mn2,{mn1,mn2}});
                    }

                    if(mn2==-1) {
                        upmax(ans,y-mx1);
                    } else {
                        upmax(ans,y-mx2);
                        s.insert({mn2-mx2,{mn2,mx2}});
                    }
                }

            } else {

                s.insert({x-m1,{x,m1}});
                s.insert({m2-y,{m2,y}});
                if (m1 != m2) s.insert({m1-m2,{m1,m2}});

            }

        } while (!s.empty());
    }
 //   cout<<ans<<endl;
    return ans;
}

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

gap.cpp: In function 'long long int findGap(int, int)':
gap.cpp:42:12: warning: unused variable 'lf' [-Wunused-variable]
         ll lf=0,rg;
            ^~
gap.cpp:42:17: warning: unused variable 'rg' [-Wunused-variable]
         ll lf=0,rg;
                 ^~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...