Submission #946114


Source Code Expand

#include <algorithm>
#include <cassert>
#include <cstring>
#include <iostream>

using namespace std;

#define FOR(i, a, b) for (int i = (a); i < (b); ++i)
#define REP(i, n) FOR(i, 0, n)
#define TRACE(x) cout << #x << " = " << x << endl
#define _ << " _ " <<

typedef long long llint;

const int mod = 1e9 + 7;

inline int add(int a, int b) {
  return a+b >= mod ? a+b-mod : a+b;
}

inline int sub(int a, int b) {
  return a >= b ? a-b : a-b+mod;
}

inline int mul(int a, int b) {
  return llint(a)*b % mod;
}

const int MAX = 500050;

int f[MAX];
int P[MAX];

int L[MAX];

int sum(int x) {
  int r = 0;
  for (++x; x; x -= x&-x)
    r += L[x];
  return r;
}

void addv(int x, int v) {
  for (++x; x < MAX; x += x&-x)
    L[x] += v;
}

bool ima[MAX];
int ls[MAX];
int G[MAX];

int main(void) {
  int N;
  scanf("%d", &N);
  REP(i, N) scanf("%d", &P[i]);

  f[0] = 1;
  REP(i, N) f[i+1] = mul(f[i], i+1);

  int F = 0;
  REP(i, N) {
    F += P[i] == 0;
    ima[P[i]] = true;
  }

  ls[0] = 0;
  for (int i = 1; i <= N; ++i)
    ls[i] = ls[i-1] + !ima[i];
  
  int ans = f[F];
  int L = 0;

  int gg = 0;
  for (int i = N-1; i >= 0; --i) {
    if (P[i]) {
      gg = add(gg, F -  ls[P[i]]);
    } else {
      G[i] = gg;
    }
  }
  REP(i, N) {
    int total = 0;
    if (P[i]) {
      int FL = P[i]-1 - sum(P[i]) - ls[P[i]];
      total = add(total, mul(FL, f[F]));

      if (F > 0) {
        total = add(total, mul(mul(ls[P[i]], F-L), f[F-1]));
      }
      addv(P[i], 1);
    } else {
      L++;
      if (F > 1) {
        int pairs = ((llint(F) * (F - 1)) / 2) % mod;
        total = add(total, mul(pairs, mul(F-L, f[F-2])));
      }
      total = add(total, mul(G[i], f[F-1]));
    }

    ans = add(ans, mul(total, f[N-i-1]));
  }

  printf("%d\n", ans);
  return 0;
}

Submission Info

Submission Time
Task E - Encyclopedia of Permutations
User ikatanic
Language C++14 (GCC 5.4.1)
Score 1200
Code Size 1878 Byte
Status AC
Exec Time 95 ms
Memory 10624 KB

Compile Error

./Main.cpp: In function ‘int main()’:
./Main.cpp:54:18: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d", &N);
                  ^
./Main.cpp:55:31: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
   REP(i, N) 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 256 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 512 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 256 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 54 ms 8064 KB
2_034.txt AC 28 ms 4096 KB
2_035.txt AC 65 ms 10624 KB
2_036.txt AC 59 ms 9728 KB
2_037.txt AC 71 ms 10496 KB
2_038.txt AC 62 ms 9216 KB
2_039.txt AC 77 ms 10496 KB
2_040.txt AC 39 ms 5376 KB
2_041.txt AC 82 ms 10496 KB
2_042.txt AC 17 ms 2176 KB
2_043.txt AC 86 ms 10496 KB
2_044.txt AC 56 ms 7040 KB
2_045.txt AC 89 ms 10496 KB
2_046.txt AC 85 ms 10112 KB
2_047.txt AC 91 ms 10496 KB
2_048.txt AC 40 ms 4736 KB
2_049.txt AC 95 ms 10496 KB
2_050.txt AC 62 ms 7040 KB
2_051.txt AC 90 ms 8576 KB
2_052.txt AC 82 ms 7808 KB
2_053.txt AC 54 ms 8064 KB
2_054.txt AC 95 ms 8576 KB
2_055.txt AC 77 ms 8576 KB
2_056.txt AC 78 ms 8576 KB
2_057.txt AC 69 ms 10496 KB