Submission #946881


Source Code Expand

#include <bits/stdc++.h>

const long long mod=1000000007ll;
const int BS=19;

void bitadd(int *bit,int i,int v)
{
  int p=i+1;
  while(p<1<<BS){
    bit[p]+=v;
    p+=p&-p;
  }
}

int bitsum(int *bit,int i)
{
  int p=i+1,ret=0;
  while(p>0){
    ret+=bit[p];
    p-=p&-p;
  }
  return ret;
}


int main()
{
  int n;
  scanf("%d",&n);
  static int P[500010];
  static bool B[500010]={0};
  int L=0;
  for(int i=0;i<n;i++){
    scanf("%d",P+i);
    if(P[i]==0){
      L++;
    }
    else{
      B[P[i]]=1;
    }
  }
  static int A[500010];
  A[n]=0;
  for(int i=n-1;i>0;i--){
    A[i]=A[i+1]+!B[i+1];
  }
  static int A2[500010];
  A2[1]=0;
  for(int i=2;i<=n;i++){
    A2[i]=A2[i-1]+B[i-1];
  }
  static long long F[500010];
  F[0]=1ll;
  for(int i=1;i<=n;i++){
    F[i]=F[i-1]*i%mod;
  }
  static int bit[1<<19]={0};
  long long ans=0ll;
  long long S0=0ll,S1=0ll;
  for(int i=1;i<=n;i++){
    if(!B[i]){
      S0+=A[i];
    }
    else{
      S1+=A[i];
    }
  }
  int K=0;
  for(int i=0;i<n;i++){
    //printf("%lld %lld\n",S0,S1);
    if(P[i]==0){
      ans+=S0%mod*(L-K-1)%mod*(L>=2?F[L-2]:0ll)%mod*F[n-i-1]%mod;
      ans%=mod;
      ans+=S1%mod*F[L-1]%mod*F[n-i-1]%mod;
      ans%=mod;
      K++;
    }
    else{
      int k=bitsum(bit,P[i]-1);
      ans+=(long long)(A2[P[i]]-k)*F[L]%mod*F[n-i-1]%mod;
      ans%=mod;
      ans+=(long long)(P[i]-1-A2[P[i]])*(L-K)%mod*(L>=1?F[L-1]:0)%mod*F[n-i-1]%mod;
      ans%=mod;
      S1-=A[P[i]];
      bitadd(bit,P[i],1);
    }
    //printf("%lld\n",ans);
  }
  ans+=F[L];
  ans%=mod;
  printf("%lld\n",ans);
  return 0;
}

Submission Info

Submission Time
Task E - Encyclopedia of Permutations
User Huziwara
Language C++14 (GCC 5.4.1)
Score 1200
Code Size 1663 Byte
Status AC
Exec Time 106 ms
Memory 12416 KB

Compile Error

./Main.cpp: In function ‘int main()’:
./Main.cpp:29:17: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d",&n);
                 ^
./Main.cpp:34:20: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d",P+i);
                    ^

Judge Result

Set Name Sample Subtask All
Score / Max Score 0 / 0 500 / 500 700 / 700
Status
AC × 5
AC × 33
AC × 58
Set Name Test Cases
Sample 0_000.txt, 0_001.txt, 0_002.txt, 0_003.txt, 0_004.txt
Subtask 0_000.txt, 0_001.txt, 0_002.txt, 0_003.txt, 0_004.txt, 1_005.txt, 1_006.txt, 1_007.txt, 1_008.txt, 1_009.txt, 1_010.txt, 1_011.txt, 1_012.txt, 1_013.txt, 1_014.txt, 1_015.txt, 1_016.txt, 1_017.txt, 1_018.txt, 1_019.txt, 1_020.txt, 1_021.txt, 1_022.txt, 1_023.txt, 1_024.txt, 1_025.txt, 1_026.txt, 1_027.txt, 1_028.txt, 1_029.txt, 1_030.txt, 1_031.txt, 1_032.txt
All 0_000.txt, 0_001.txt, 0_002.txt, 0_003.txt, 0_004.txt, 1_005.txt, 1_006.txt, 1_007.txt, 1_008.txt, 1_009.txt, 1_010.txt, 1_011.txt, 1_012.txt, 1_013.txt, 1_014.txt, 1_015.txt, 1_016.txt, 1_017.txt, 1_018.txt, 1_019.txt, 1_020.txt, 1_021.txt, 1_022.txt, 1_023.txt, 1_024.txt, 1_025.txt, 1_026.txt, 1_027.txt, 1_028.txt, 1_029.txt, 1_030.txt, 1_031.txt, 1_032.txt, 2_033.txt, 2_034.txt, 2_035.txt, 2_036.txt, 2_037.txt, 2_038.txt, 2_039.txt, 2_040.txt, 2_041.txt, 2_042.txt, 2_043.txt, 2_044.txt, 2_045.txt, 2_046.txt, 2_047.txt, 2_048.txt, 2_049.txt, 2_050.txt, 2_051.txt, 2_052.txt, 2_053.txt, 2_054.txt, 2_055.txt, 2_056.txt, 2_057.txt
Case Name Status Exec Time Memory
0_000.txt AC 3 ms 256 KB
0_001.txt AC 3 ms 256 KB
0_002.txt AC 3 ms 256 KB
0_003.txt AC 3 ms 256 KB
0_004.txt AC 3 ms 256 KB
1_005.txt AC 3 ms 256 KB
1_006.txt AC 3 ms 256 KB
1_007.txt AC 3 ms 384 KB
1_008.txt AC 3 ms 384 KB
1_009.txt AC 3 ms 256 KB
1_010.txt AC 3 ms 384 KB
1_011.txt AC 3 ms 384 KB
1_012.txt AC 3 ms 384 KB
1_013.txt AC 3 ms 256 KB
1_014.txt AC 3 ms 384 KB
1_015.txt AC 3 ms 256 KB
1_016.txt AC 3 ms 384 KB
1_017.txt AC 3 ms 256 KB
1_018.txt AC 3 ms 384 KB
1_019.txt AC 3 ms 256 KB
1_020.txt AC 3 ms 384 KB
1_021.txt AC 3 ms 256 KB
1_022.txt AC 3 ms 384 KB
1_023.txt AC 3 ms 384 KB
1_024.txt AC 3 ms 384 KB
1_025.txt AC 3 ms 256 KB
1_026.txt AC 3 ms 384 KB
1_027.txt AC 3 ms 384 KB
1_028.txt AC 3 ms 384 KB
1_029.txt AC 3 ms 384 KB
1_030.txt AC 3 ms 384 KB
1_031.txt AC 3 ms 384 KB
1_032.txt AC 3 ms 384 KB
2_033.txt AC 61 ms 9984 KB
2_034.txt AC 31 ms 5120 KB
2_035.txt AC 70 ms 12416 KB
2_036.txt AC 64 ms 11520 KB
2_037.txt AC 76 ms 12416 KB
2_038.txt AC 67 ms 11008 KB
2_039.txt AC 84 ms 12416 KB
2_040.txt AC 42 ms 6400 KB
2_041.txt AC 89 ms 12416 KB
2_042.txt AC 18 ms 2560 KB
2_043.txt AC 94 ms 12416 KB
2_044.txt AC 61 ms 8320 KB
2_045.txt AC 97 ms 12416 KB
2_046.txt AC 93 ms 11904 KB
2_047.txt AC 100 ms 12416 KB
2_048.txt AC 44 ms 5632 KB
2_049.txt AC 105 ms 12416 KB
2_050.txt AC 67 ms 8320 KB
2_051.txt AC 101 ms 12416 KB
2_052.txt AC 90 ms 11264 KB
2_053.txt AC 61 ms 9984 KB
2_054.txt AC 106 ms 12416 KB
2_055.txt AC 86 ms 12416 KB
2_056.txt AC 88 ms 12416 KB
2_057.txt AC 79 ms 12416 KB