Submission #945301
Source Code Expand
#include <cstdio> #include <cstdlib> #include <cstring> #include <iostream> #include <vector> #include <string> #include <algorithm> #include <stack> #include <queue> #include <set> #include <cmath> #include <map> using namespace std; #define MOD 1000000007 #define ADD(X,Y) ((X) = ((X) + (Y)%MOD) % MOD) typedef long long i64; typedef vector<int> ivec; typedef vector<string> svec; i64 modpow(i64 a, int p = MOD - 2) { if (p == 0) return 1; i64 ret = modpow(a, p / 2); ret = ret * ret % MOD; if (p % 2 == 1) ret = ret * a % MOD; return ret; } struct segtree { static const int DEPTH = 19; static const int N = 1 << DEPTH; int val[2 * N]; void init() { for (int i = 0; i < 2 * N; ++i) val[i] = 0; } void incl(int p, int v) { p += N; while (p) { val[p] += v; p >>= 1; } } int query(int L, int R) { L += N; R += N; int ret = 0; while (L < R) { if (L & 1) ret += val[L++]; if (R & 1) ret += val[--R]; L >>= 1; R >>= 1; } return ret; } }; int N, P[505050]; vector<int> uus; bool used[505050]; segtree seg; i64 invs[505050]; int main() { scanf("%d", &N); for (int i = 0; i < N; ++i) { scanf("%d", P + i); --P[i]; } invs[0] = 0; for (int i = 1; i <= N; ++i) invs[i] = modpow(i); i64 mult = 1; int uu = 0; for (int i = 0; i < N; ++i) { if (P[i] >= 0) used[P[i]] = true; } for (int i = 0; i < N; ++i) if (!used[i]) uus.push_back(i); seg.init(); i64 ret = 0; i64 ap = 0; i64 waf = uus.size() * (uus.size() - 1) / 2 % MOD; waf = waf * invs[uus.size()] % MOD; if (uus.size() > 0) waf = waf * invs[uus.size() - 1] % MOD; i64 fuee = 1; int pohe = 0; for (int i = 0; i < N; ++i) { if (P[i] == -1) { ++pohe; fuee = fuee * pohe % MOD; } } i64 m2 = 1; for (int i = N - 1; i >= 0; --i) { if (P[i] == -1) { // ADD(ret, ap); ADD(ret, (waf * uu % MOD + ap * invs[uus.size()]) % MOD * m2 % MOD * fuee % MOD); /// printf("%lld\n", (waf * uu + ap * invs[uus.size()]) % MOD * m2 % MOD * fuee % MOD); // printf("%lld %lld\n", uu, ap); ++uu; mult = mult * uu % MOD; } else { int lt = lower_bound(uus.begin(), uus.end(), P[i]) - uus.begin(); int gt = uus.size() - lt; // int gt = (uus.size() - (lower_bound(uus.begin(), uus.end(), P[i]) - uus.begin())); // int lt = uus.size() - lt; // printf("%d %d\n", lt, gt); ADD(ap, gt); ADD(ret, (seg.query(0, P[i]) + lt * invs[uus.size()] % MOD * uu) % MOD * m2 % MOD * fuee); seg.incl(P[i], 1); } m2 *= N - i; m2 %= MOD; } // printf("%lld\n", mult); ADD(ret, mult); // ADD(ret, 1); //ret = ret * mult % MOD; printf("%lld\n", ret); return 0; }
Submission Info
Submission Time | |
---|---|
Task | E - Encyclopedia of Permutations |
User | semiexp |
Language | C++14 (GCC 5.4.1) |
Score | 1200 |
Code Size | 2743 Byte |
Status | AC |
Exec Time | 283 ms |
Memory | 12528 KB |
Compile Error
./Main.cpp: In function ‘int main()’: ./Main.cpp:68:17: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result] scanf("%d", &N); ^ ./Main.cpp:70:21: 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 |
|
|
|
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 | 7 ms | 4352 KB |
0_001.txt | AC | 7 ms | 4352 KB |
0_002.txt | AC | 7 ms | 4352 KB |
0_003.txt | AC | 7 ms | 4480 KB |
0_004.txt | AC | 7 ms | 4352 KB |
1_005.txt | AC | 7 ms | 4480 KB |
1_006.txt | AC | 7 ms | 4352 KB |
1_007.txt | AC | 7 ms | 4352 KB |
1_008.txt | AC | 8 ms | 4352 KB |
1_009.txt | AC | 7 ms | 4352 KB |
1_010.txt | AC | 8 ms | 4480 KB |
1_011.txt | AC | 8 ms | 4352 KB |
1_012.txt | AC | 8 ms | 4352 KB |
1_013.txt | AC | 7 ms | 4352 KB |
1_014.txt | AC | 8 ms | 4352 KB |
1_015.txt | AC | 7 ms | 4352 KB |
1_016.txt | AC | 8 ms | 4352 KB |
1_017.txt | AC | 7 ms | 4352 KB |
1_018.txt | AC | 8 ms | 4352 KB |
1_019.txt | AC | 7 ms | 4352 KB |
1_020.txt | AC | 8 ms | 4352 KB |
1_021.txt | AC | 7 ms | 4352 KB |
1_022.txt | AC | 8 ms | 4352 KB |
1_023.txt | AC | 8 ms | 4352 KB |
1_024.txt | AC | 8 ms | 4352 KB |
1_025.txt | AC | 7 ms | 4352 KB |
1_026.txt | AC | 8 ms | 4352 KB |
1_027.txt | AC | 7 ms | 4352 KB |
1_028.txt | AC | 8 ms | 4480 KB |
1_029.txt | AC | 8 ms | 4352 KB |
1_030.txt | AC | 8 ms | 4352 KB |
1_031.txt | AC | 8 ms | 4352 KB |
1_032.txt | AC | 8 ms | 4352 KB |
2_033.txt | AC | 180 ms | 12272 KB |
2_034.txt | AC | 94 ms | 8436 KB |
2_035.txt | AC | 200 ms | 12528 KB |
2_036.txt | AC | 182 ms | 11888 KB |
2_037.txt | AC | 215 ms | 12400 KB |
2_038.txt | AC | 190 ms | 11376 KB |
2_039.txt | AC | 235 ms | 12144 KB |
2_040.txt | AC | 116 ms | 8436 KB |
2_041.txt | AC | 250 ms | 11888 KB |
2_042.txt | AC | 50 ms | 5884 KB |
2_043.txt | AC | 258 ms | 11636 KB |
2_044.txt | AC | 168 ms | 9204 KB |
2_045.txt | AC | 267 ms | 11508 KB |
2_046.txt | AC | 256 ms | 11124 KB |
2_047.txt | AC | 277 ms | 11256 KB |
2_048.txt | AC | 120 ms | 7420 KB |
2_049.txt | AC | 283 ms | 11004 KB |
2_050.txt | AC | 180 ms | 8828 KB |
2_051.txt | AC | 237 ms | 10752 KB |
2_052.txt | AC | 214 ms | 10112 KB |
2_053.txt | AC | 180 ms | 12272 KB |
2_054.txt | AC | 241 ms | 10752 KB |
2_055.txt | AC | 224 ms | 10752 KB |
2_056.txt | AC | 224 ms | 10752 KB |
2_057.txt | AC | 213 ms | 11892 KB |