QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#168804 | #5047. Permutation | absinthe | WA | 27ms | 17776kb | C++20 | 2.8kb | 2023-09-08 22:28:12 | 2023-09-08 22:28:13 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 500'005;
int a[N];
int loc[N];
int l[N], r[N];
int fl[N], fr[N];
int tag[N];
int n, c;
ll MOD = 998244353;
ll fac[N];
void add_group(int l, int r, int g, int fl, int fr, bool init) {
if(r <= 0 || l > n) return;
if(init && l <= 0) {
for(int i = 1; i <= r; ++i) tag[i] = -1;
return;
}
if(init && r > n) {
for(int i = l; i <= n; ++i) tag[i] = -1;
return;
}
int tmp = 0;
l = max(l, 1);
r = min(r, n);
for(int i = l; i <= r; ++i) {
if(tag[i] == -1) {
if(init) return;
if(fl) r = min(r, i - 1);
if(fr) l = max(l, i + 1);
}
// if(tag[i] != 0) tmp = tag[i];
}
if(l > r) return;
for(int i = l; i <= r; ++i) if(tag[i] != 0) tmp = tag[i];
if(::l[g] == 0)
::l[g] = ::r[g] = l;
for(int i = l; i <= r; ++i) {
tag[i] = g;
}
::l[g] = min(::l[g], l);
::r[g] = max(::r[g], r);
::fl[g] += fl;
::fr[g] += fr;
if(tmp) {
for(int i = ::l[tmp]; i <= ::r[tmp]; ++i) {
tag[i] = g;
}
::l[g] = min(::l[g], ::l[tmp]);
::r[g] = max(::r[g], ::r[tmp]);
::fl[g] += ::fl[tmp];
::fr[g] += ::fr[tmp];
::l[tmp] = ::r[tmp] = ::fl[tmp] = ::fr[tmp] = 0;
if(fr) --::fr[g];
if(fl) --::fl[g];
}
}
void test() {
cin>>n>>c;
fac[0] = 1;
for(int i = 1; i <= n; ++i) {
cin>>a[i];
loc[a[i]] = i;
tag[i] = l[i] = r[i] = fl[i] = fr[i] = 0;
fac[i] = fac[i - 1] * i % MOD;
}
int g = 0;
ll res = 1;
for(int val = 1; val <= n; ++val) {
int i = loc[val];
if(tag[i] == 0) {
tag[i] = -1;
add_group(i - c, i - 1, ++g, 0, 1, 1);
add_group(i + 1, i + c, ++g, 1, 0, 1);
continue;
}
if(tag[i] == -1) continue;
add_group(l[tag[i]] - c, l[tag[i]] - 1, tag[i], 0, 1, 0);
add_group(r[tag[i]] + 1, r[tag[i]] + c, tag[i], 1, 0, 0);
}
for(int i = 1; i <= g; ++i) {
if(l[i] == 0) continue;
if(fl[i] == 0 || fr[i] == 0){
if(fl[i]) --fl[i];
if(fr[i]) --fr[i];
}
// cout<<i<<' '<<l[i]<<' '<<r[i]<<' '<<fl[i]<<' '<<fr[i]<<'\n';
for(int j = 1; j <= fl[i]; ++j) res = res * (c * j - (j - 1)) % MOD;
for(int j = 1; j <= fr[i]; ++j) res = res * (c * j - (j - 1)) % MOD;
res = res * fac[r[i] - l[i] + 1 - fl[i] - fr[i]] % MOD;
}
cout<<res<<'\n';
}
signed main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int T;
cin >> T;
while (T--) {
test();
}
}
詳細信息
Test #1:
score: 100
Accepted
time: 1ms
memory: 17712kb
input:
5 5 3 3 4 2 1 5 5 4 4 2 1 3 5 5 2 4 5 3 1 2 5 3 4 3 2 1 5 5 2 2 3 1 5 4
output:
6 1 4 6 4
result:
ok 5 number(s): "6 1 4 6 4"
Test #2:
score: 0
Accepted
time: 27ms
memory: 17776kb
input:
100000 5 4 1 3 2 5 4 5 3 5 1 4 2 3 5 2 1 4 5 3 2 5 4 5 2 4 3 1 5 4 2 5 4 1 3 5 4 1 2 3 5 4 5 4 4 3 2 5 1 5 3 1 5 4 3 2 5 3 3 2 5 4 1 5 4 4 3 1 5 2 5 4 4 3 5 2 1 5 2 3 2 1 4 5 5 3 2 4 5 1 3 5 3 2 1 4 3 5 5 3 2 1 5 4 3 5 2 2 1 3 4 5 5 4 2 3 1 4 5 5 2 1 2 4 5 3 5 3 2 4 1 5 3 5 3 2 4 3 5 1 5 3 4 1 3 5 2...
output:
24 6 6 24 1 24 24 6 18 1 24 4 6 6 6 4 1 12 1 6 6 24 18 2 18 4 6 6 18 6 4 1 6 18 1 6 24 18 6 1 12 18 6 4 2 24 12 4 24 4 4 24 6 1 1 1 1 6 1 4 1 18 1 18 4 4 6 24 6 4 6 1 12 1 4 4 6 24 18 6 2 6 1 12 6 24 1 4 6 1 1 6 1 1 24 12 18 1 4 18 1 4 24 6 4 24 6 24 1 1 6 1 18 24 1 4 1 1 2 6 1 6 4 18 1 24 6 6 4 24 ...
result:
ok 100000 numbers
Test #3:
score: -100
Wrong Answer
time: 3ms
memory: 15732kb
input:
10000 10 2 7 4 2 9 1 3 10 5 8 6 10 7 10 6 1 5 2 4 7 9 8 3 10 4 10 7 6 2 8 1 5 4 3 9 10 4 4 9 6 2 10 7 8 5 1 3 10 5 9 8 7 4 5 3 2 10 6 1 10 3 5 7 8 1 9 4 6 10 3 2 10 4 6 2 10 8 4 7 9 5 3 1 10 5 10 1 3 7 5 9 4 2 8 6 10 7 10 3 4 5 6 1 9 2 8 7 10 4 1 8 9 7 5 6 3 10 4 2 10 3 6 7 3 1 9 4 10 8 5 2 10 3 5 1...
output:
432 5040 2304 24 201600 720 5040 120 1 11520 720 120 1 216 120 120 2160 141120 144 1 480 1 108 24 1 432 25200 1 30240 35280 35280 720 1800 576 1296 120 35280 20160 432 432 8 201600 96 432 141120 201600 2304 720 1152 576 1 120 201600 576 360 241920 40320 24 1 1 1 35280 1 1 1 3600 720 108 720 1 1296 1...
result:
wrong answer 10th numbers differ - expected: '20160', found: '11520'