提出 #74382649


ソースコード 拡げる

#include<bits/stdc++.h>

// #define XAERIC666
#define int long long
#define pii pair<int,int>
#define fi first
#define se second
#ifndef XAERIC666
  #define xaeric(...) {fprintf(stderr,__VA_ARGS__);fflush(stderr);}
#else
  #define xaeric(...) 114514
#endif
int read(){
  int x=0,f=1;
  char c=getchar();
  while(c<'0'||'9'<c){if(c=='-')f=-1;c=getchar();}
  while('0'<=c&&c<='9'){x=x*10+c-48;c=getchar();}
  return x*f;
}
// void in(int*a,int n){for(int i=1;i<=n;i++)a[i]=read();}
// void out(int*a,int n){for(int i=1;i<=n;i++)printf("%lld%c",a[i]," \n"[i==n]);}
#define rep(i,a,b) for(int i=(a);i<=(b);++i)
#define _rep(i,a,b) for(int i=(b);i>=(a);--i)
#define YES puts("YES");
#define NO puts("NO");
using namespace std;

const int P=998244353;
const int N=5005;
int fac[N],ifac[N];
int qpow(int a,int k,int p=P){
  int r=1;
  while(k){
    if(k&1){
      r=r*a%p;
    }
    a=a*a%p;
    k/=2;
  }
  return r;
}
void zuhe(int n){
  fac[0]=1;
  for(int i=1;i<=n;i++){
    fac[i]=fac[i-1]*i%P;
  }
  ifac[n]=qpow(fac[n],P-2);
  for(int i=n-1;~i;i--){
    ifac[i]=ifac[i+1]*(i+1)%P;
  }
}
int c(int n,int m){
  if(n<0||m<0){
    return 0;
  }
  if(m>n){
    return 0;
  }
  return fac[n]*ifac[m]%P*ifac[n-m]%P;
}
int n,m,a[N],pre[N],suf[N];
int ans[N][N];
int cnt[N],v[N],x[N][N],y[N][N];
int pp[N];
void solve(){
  zuhe(N-5);
  n=read(),m=read();
  for(int i=1;i<=n;i++){
    a[i]=read();
    cnt[i]=cnt[i-1]+(a[i]==-1);
    v[a[i]]=1;
  }
  pre[0]=n;
  for(int i=1;i<=n;i++){
    pre[i]=pre[i-1];
    if(a[i]!=-1){
      pre[i]=min(pre[i],a[i]);
    }
    pp[i]=pp[i-1];
    if(!v[i]){
      pp[i]++;
    }
  }
  suf[n+1]=n;
  for(int i=n;i>=1;i--){
    suf[i]=suf[i+1];
    if(a[i]!=-1){
      suf[i]=min(suf[i],a[i]);
    }
    // xaeric("  + %lld\n",suf[i]);
  }
  for(int cc=0;cc<=cnt[n];cc++){
    x[cc][0]=0;
    for(int i=1;i<=n;i++){
      x[cc][i]=x[cc][i-1];
      if(!v[i]){
        x[cc][i]+=(c(pp[n-1]-pp[i-1],cc)-c(pp[n-1]-pp[i],cc)+P)%P*i%P;
        x[cc][i]%=P;
      }
    }
    for(int i=n;i>=1;i--){
      y[cc][i]=y[cc][i+1];
      if(!v[i]){
        y[cc][i]+=(c(pp[n-1]-pp[i-1],cc)-c(pp[n-1]-pp[i],cc)+P)%P;
        y[cc][i]%=P;
      }
    }
    // xaeric("! %lld\n",cc);
    // for(int i=1;i<=n;i++){
    //   xaeric("   + %lld %lld %lld\n",i,x[cc][i],y[cc][i]);
    // }
    ans[cc][0]=0;
    for(int m=1;m<=n;m++){
      ans[cc][m]=(x[cc][m-1]+y[cc][m]*m%P)%P*fac[cc]%P*fac[cnt[n]-cc]%P;
    }
  }
  for(int i=1;i<=m;i++){
    int x=read(),y=read();
    int tmp=min(pre[x-1],suf[y+1]);
    // xaeric("  ! %lld %lld\n",pre[x-1],suf[y+1]);
    printf("%lld\n",ans[cnt[n]-(cnt[y]-cnt[x-1])][tmp]);
  }
}

signed main(){
  int TTTT=1;
  // int TTTT=read();
  while(TTTT--){
    solve();
  }
}

提出情報

提出日時
問題 B - Range Mex Sum
ユーザ Xaeric
言語 C++23 (GCC 15.2.0)
得点 700
コード長 2844 Byte
結果 AC
実行時間 616 ms
メモリ 597592 KiB

ジャッジ結果

セット名 Sample All
得点 / 配点 0 / 0 700 / 700
結果
AC × 3
AC × 55
セット名 テストケース
Sample 00_sample_00.txt, 00_sample_01.txt, 00_sample_02.txt
All 00_sample_00.txt, 00_sample_01.txt, 00_sample_02.txt, 01_test_00.txt, 01_test_01.txt, 01_test_02.txt, 01_test_03.txt, 01_test_04.txt, 01_test_05.txt, 01_test_06.txt, 01_test_07.txt, 01_test_08.txt, 01_test_09.txt, 01_test_10.txt, 01_test_11.txt, 01_test_12.txt, 01_test_13.txt, 01_test_14.txt, 01_test_15.txt, 01_test_16.txt, 01_test_17.txt, 01_test_18.txt, 01_test_19.txt, 01_test_20.txt, 01_test_21.txt, 01_test_22.txt, 01_test_23.txt, 01_test_24.txt, 01_test_25.txt, 01_test_26.txt, 01_test_27.txt, 01_test_28.txt, 01_test_29.txt, 01_test_30.txt, 01_test_31.txt, 01_test_32.txt, 01_test_33.txt, 01_test_34.txt, 01_test_35.txt, 01_test_36.txt, 01_test_37.txt, 01_test_38.txt, 01_test_39.txt, 01_test_40.txt, 01_test_41.txt, 01_test_42.txt, 01_test_43.txt, 01_test_44.txt, 01_test_45.txt, 01_test_46.txt, 01_test_47.txt, 01_test_48.txt, 01_test_49.txt, 01_test_50.txt, 01_test_51.txt
ケース名 結果 実行時間 メモリ
00_sample_00.txt AC 1 ms 3912 KiB
00_sample_01.txt AC 1 ms 3824 KiB
00_sample_02.txt AC 1 ms 3896 KiB
01_test_00.txt AC 66 ms 41148 KiB
01_test_01.txt AC 65 ms 40980 KiB
01_test_02.txt AC 66 ms 40940 KiB
01_test_03.txt AC 66 ms 40952 KiB
01_test_04.txt AC 68 ms 40824 KiB
01_test_05.txt AC 63 ms 37664 KiB
01_test_06.txt AC 67 ms 37736 KiB
01_test_07.txt AC 45 ms 21696 KiB
01_test_08.txt AC 51 ms 21684 KiB
01_test_09.txt AC 36 ms 4024 KiB
01_test_10.txt AC 37 ms 4284 KiB
01_test_11.txt AC 33 ms 4024 KiB
01_test_12.txt AC 35 ms 4040 KiB
01_test_13.txt AC 602 ms 596136 KiB
01_test_14.txt AC 595 ms 597592 KiB
01_test_15.txt AC 590 ms 597564 KiB
01_test_16.txt AC 599 ms 592240 KiB
01_test_17.txt AC 583 ms 594764 KiB
01_test_18.txt AC 575 ms 587780 KiB
01_test_19.txt AC 583 ms 587684 KiB
01_test_20.txt AC 571 ms 581688 KiB
01_test_21.txt AC 587 ms 581900 KiB
01_test_22.txt AC 509 ms 534672 KiB
01_test_23.txt AC 532 ms 532828 KiB
01_test_24.txt AC 429 ms 476080 KiB
01_test_25.txt AC 464 ms 476024 KiB
01_test_26.txt AC 257 ms 299676 KiB
01_test_27.txt AC 281 ms 297780 KiB
01_test_28.txt AC 110 ms 121528 KiB
01_test_29.txt AC 130 ms 123328 KiB
01_test_30.txt AC 75 ms 62900 KiB
01_test_31.txt AC 88 ms 62784 KiB
01_test_32.txt AC 45 ms 15796 KiB
01_test_33.txt AC 50 ms 15780 KiB
01_test_34.txt AC 42 ms 9888 KiB
01_test_35.txt AC 43 ms 9924 KiB
01_test_36.txt AC 38 ms 5324 KiB
01_test_37.txt AC 40 ms 5464 KiB
01_test_38.txt AC 37 ms 4800 KiB
01_test_39.txt AC 39 ms 4796 KiB
01_test_40.txt AC 35 ms 4284 KiB
01_test_41.txt AC 38 ms 4172 KiB
01_test_42.txt AC 616 ms 569976 KiB
01_test_43.txt AC 568 ms 534840 KiB
01_test_44.txt AC 500 ms 476112 KiB
01_test_45.txt AC 372 ms 358448 KiB
01_test_46.txt AC 264 ms 240952 KiB
01_test_47.txt AC 172 ms 123472 KiB
01_test_48.txt AC 116 ms 64568 KiB
01_test_49.txt AC 74 ms 29356 KiB
01_test_50.txt AC 2 ms 3928 KiB
01_test_51.txt AC 1 ms 3900 KiB