제출 #1150662

#제출 시각아이디문제언어결과실행 시간메모리
1150662alir3za_zar3Marathon Race 2 (JOI24_ho_t3)C++20
100 / 100
139 ms21616 KiB
// Alir3za.Zar3 -> Shiraz , Iran
#include <bits/stdc++.h>
using namespace std;
#define     int     long long

const int mxN = 1e3+7 , Inf = 2e18;
int n,L , x[mxN<<9] , joi;
int dp[2][mxN][mxN] , f[2][mxN] , px[mxN<<9];
vector<pair<int,int>> p;

void iN ()
{
    cin >> n >> L; joi=n;
    for (int i=1; i<=n; i++)
        cin >> x[i];
}

void compress ()
{
    sort(x+1,x+n+1);
    p.push_back( { x[1] , 0 } );
    for (int i=1; i<=n; i++)
    {
        if (p.back().first == x[i]) 
            p.back().second++;
        else p.push_back( { x[i] , 1 } );
        px[ x[ i ] ]++;
    }
    n = p.size();
    for (int i=1; i<(mxN<<9); i++)
        px[i] += px[i-1];
}

void fill_dp ()
{
    if (n >= mxN) return;

    for (int T=0; T<2; T++)
    {
        for (int l=0; l<n; l++)
            for (int r=0; r<n; r++)
                dp[0][l][r] = dp[1][l][r] = Inf;
        dp[T][0][n-1] = 0;

        for (int len = n; len>1; len--)
            for (int l=0 , r=len-1; r<n; l++,r++)
            {
                int ball = joi + px[ p[l].first-1 ] - px[ p[r].first ] + 1;

                dp[0][l+1][r] = min( dp[0][l+1][r] , dp[0][l][r] + (ball + p[l].second)*(p[l+1].first-p[l].first) );
                dp[0][l+1][r] = min( dp[0][l+1][r] , dp[1][l][r] + ball*(p[r].first+p[l+1].first-2*p[l].first) + p[l].second*(p[l+1].first-p[l].first) );

                dp[1][l][r-1] = min( dp[1][l][r-1] , dp[1][l][r] + (ball + p[r].second)*(p[r].first-p[r-1].first));
                dp[1][l][r-1] = min( dp[1][l][r-1] , dp[0][l][r] + ball*(2*p[r].first-p[l].first-p[r-1].first) + p[r].second*(p[r].first-p[r-1].first) );
            }

        for (int i=0; i<n; i++)
            f[T][i] = min(dp[0][i][i] , dp[1][i][i]);
    }
}

void ouT ()
{
    int q; cin >> q;
    while (q--)
    {
        int st , en , T;
        cin >> st >> en >> T;
        T -= joi;
        if (n >= mxN) 
        {
            cout << "No\n";
            continue;
        }
        int k = lower_bound(p.begin(),p.end(),make_pair(en,0ll))-p.begin();
        int out = Inf;
        for (int i=max(0ll , k-2); i<=min(n-1 , k+2); i++)
        {
            out = min( out , f[0][i] + abs(st-p[0].first) + (joi+1)*abs(en-p[i].first) );
            out = min( out , f[1][i] + abs(st-p[n-1].first) + (joi+1)*abs(en-p[i].first) );
        }
        if (out <= T)
            cout << "Yes\n";
        else 
            cout << "No\n";
    }
}

signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);     cout.tie(0);

    iN ();
    compress ();
    fill_dp ();
    ouT ();
}
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...