Submission #1309867

#TimeUsernameProblemLanguageResultExecution timeMemory
1309867StefanSebezMarathon Race 2 (JOI24_ho_t3)C++20
100 / 100
146 ms25476 KiB
#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pb push_back
#define ll long long
#define ld long double
#define mp make_pair
const int N=5e5+50,S=1300;
const ll INF=1e18;
void chmn(ll &x,ll y){x=min(x,y);}
int n,L,q;
int a[N],num[N],prefnum[N];
ll dp1[S+5][S+5][2],dp2[S+5][S+5][2];
ll pref1[N],suf1[N];
ll pref2[N],suf2[N];
int main(){
    scanf("%i%i",&n,&L);
    for(int i=1;i<=n;i++)scanf("%i",&a[i]);
    sort(a+1,a+n+1);
    int m=0;
    for(int i=1;i<=n;){
        int j=i;
        while(j<=n&&a[i]==a[j])j++;
        a[++m]=a[i];
        num[m]=j-i;
        i=j;
    }
    for(int i=m+1;i<=n;i++)a[i]=0;
    for(int i=1;i<=m;i++)prefnum[i]=prefnum[i-1]+num[i];
    if(m<S){
        for(int l=1;l<=m;l++)for(int r=l;r<=m;r++)dp1[l][r][0]=dp1[l][r][1]=INF;
        dp1[1][m][0]=0;
        for(int d=n-1;d>=1;d--){
            for(int l=1;l+d-1<=m;l++){
                int r=l+d-1;
                if(l>1)chmn(dp1[l][r][0],dp1[l-1][r][0]+(ll)abs(a[l-1]-a[l])*(n+1-(prefnum[r]-prefnum[l-1])));
                if(r<m)chmn(dp1[l][r][0],dp1[l][r+1][1]+(ll)abs(a[r+1]-a[l])*(n+1-(prefnum[r]-prefnum[l-1])));
                if(l>1)chmn(dp1[l][r][1],dp1[l-1][r][0]+(ll)abs(a[l-1]-a[r])*(n+1-(prefnum[r]-prefnum[l-1])));
                if(r<m)chmn(dp1[l][r][1],dp1[l][r+1][1]+(ll)abs(a[r+1]-a[r])*(n+1-(prefnum[r]-prefnum[l-1])));
            }
        }
        for(int l=1;l<=m;l++)for(int r=l;r<=m;r++)dp2[l][r][0]=dp2[l][r][1]=INF;
        dp2[1][m][1]=0;
        for(int d=n-1;d>=1;d--){
            for(int l=1;l+d-1<=m;l++){
                int r=l+d-1;
                if(l>1)chmn(dp2[l][r][0],dp2[l-1][r][0]+(ll)abs(a[l-1]-a[l])*(n+1-(prefnum[r]-prefnum[l-1])));
                if(r<m)chmn(dp2[l][r][0],dp2[l][r+1][1]+(ll)abs(a[r+1]-a[l])*(n+1-(prefnum[r]-prefnum[l-1])));
                if(l>1)chmn(dp2[l][r][1],dp2[l-1][r][0]+(ll)abs(a[l-1]-a[r])*(n+1-(prefnum[r]-prefnum[l-1])));
                if(r<m)chmn(dp2[l][r][1],dp2[l][r+1][1]+(ll)abs(a[r+1]-a[r])*(n+1-(prefnum[r]-prefnum[l-1])));
            }
        }
        for(int i=0;i<=m+1;i++)pref1[i]=suf1[i]=INF;
        for(int i=1;i<=m;i++) pref1[i]=min(pref1[i-1],dp1[i][i][0]-(ll)a[i]*(n+1));
        for(int i=m;i>=1;i--) suf1[i]=min(suf1[i+1],dp1[i][i][0]+(ll)a[i]*(n+1));
        for(int i=0;i<=m+1;i++)pref2[i]=suf2[i]=INF;
        for(int i=1;i<=m;i++) pref2[i]=min(pref2[i-1],dp2[i][i][0]-(ll)a[i]*(n+1));
        for(int i=m;i>=1;i--) suf2[i]=min(suf2[i+1],dp2[i][i][0]+(ll)a[i]*(n+1));
    }
    scanf("%i",&q);
    while(q--){
        int u,v,t;scanf("%i%i%i",&u,&v,&t);
        if(m>=S){
            printf("No\n");
            continue;
        }
        ll mn=INF;
        int lb=lower_bound(a+1,a+m+1,v)-a;
        chmn(mn,pref1[lb-1]+(ll)v*(n+1)+abs(u-a[1]));
        chmn(mn,suf1[lb]-(ll)v*(n+1)+abs(u-a[1]));
        chmn(mn,pref2[lb-1]+(ll)v*(n+1)+abs(u-a[m]));
        chmn(mn,suf2[lb]-(ll)v*(n+1)+abs(u-a[m]));
        mn+=n;
        if(mn<=t)printf("Yes\n");
        else printf("No\n");
    }
    return 0;
}

Compilation message (stderr)

Main.cpp: In function 'int main()':
Main.cpp:18:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   18 |     scanf("%i%i",&n,&L);
      |     ~~~~~^~~~~~~~~~~~~~
Main.cpp:19:31: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   19 |     for(int i=1;i<=n;i++)scanf("%i",&a[i]);
      |                          ~~~~~^~~~~~~~~~~~
Main.cpp:61:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   61 |     scanf("%i",&q);
      |     ~~~~~^~~~~~~~~
Main.cpp:63:24: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   63 |         int u,v,t;scanf("%i%i%i",&u,&v,&t);
      |                   ~~~~~^~~~~~~~~~~~~~~~~~~
#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...