提出 #72414091
ソースコード 拡げる
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int MAX = 600001;
const int MAX_LOG = 30;
const int MOD = 998244353;
int P[MAX], A[MAX], B[MAX],
parent[MAX][MAX_LOG], D[MAX], C[MAX],
fac[MAX], inv[MAX], uf[MAX], sz[MAX];
vector<int> adj[MAX], val[MAX], arr[MAX], act[MAX];
bool chk[MAX];
int find(int X) { return X == uf[X] ? X : uf[X] = find(uf[X]); }
void uni(int X, int Y) {
X = find(X), Y = find(Y);
if (X == Y)
return;
else if (X > Y)
swap(X, Y);
uf[Y] = X, sz[X] += sz[Y], sz[Y] = 0;
}
int fpow(int N, int K) {
int res = 1;
while (K) {
if (K & 1)
res = res * N % MOD;
N = N * N % MOD, K >>= 1;
}
return res;
}
int comb(int N, int K) {
if (K < 0 || K > N)
return 0;
return fac[N] * inv[K] % MOD * inv[N - K] % MOD;
}
void dfs(int node, int par) {
parent[node][0] = par, D[node] = D[par] + 1;
for (int i = 1; i < MAX_LOG; i++)
parent[node][i] = parent[parent[node][i - 1]][i - 1];
for (int i : adj[node])
dfs(i, node);
}
int lca(int X, int Y) {
if (D[X] < D[Y])
swap(X, Y);
int diff = D[X] - D[Y];
for (int i = 0; i < MAX_LOG; i++)
if (diff & (1 << i))
X = parent[X][i];
for (int i = MAX_LOG - 1; i >= 0; i--)
if (parent[X][i] != parent[Y][i])
X = parent[X][i], Y = parent[Y][i];
if (X != Y)
X = parent[X][0];
return X;
}
signed main() {
ios_base::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
int N, M, ans = 1, X, Y, V, MD = 0;
cin >> N >> M;
for (int i = 0; i + 1 < N; i++)
cin >> P[i];
for (int i = 0; i < M; i++)
cin >> A[i];
for (int i = 0; i < M; i++)
cin >> B[i];
for (int i = 2; i <= N; i++)
adj[P[i - 2]].push_back(i);
dfs(1, 0);
for (int i = 0; i + 1 < M; i++)
C[i] = D[lca(B[i], B[i + 1])];
fac[0] = 1, X = max(N, M);
for (int i = 1; i <= X; i++)
fac[i] = fac[i - 1] * i % MOD;
inv[X] = fpow(fac[X], MOD - 2);
for (int i = X - 1; i >= 0; i--)
inv[i] = inv[i + 1] * (i + 1) % MOD;
for (int i = 1; i <= N; i++)
arr[D[i]].push_back(i), MD = max(D[i], MD);
for (int i = 0; i < M; i++) {
val[A[i]].push_back(i);
uf[i] = i, sz[i] = 1;
}
for (int i = 0; i + 1 < M; i++)
act[C[i]].push_back(i);
// i, i + 1 swap -> max(A[i], A[i + 1]) <= C[i]
for (int i = MD; i >= 1; i--) {
for (int j : act[i])
if (!chk[j] && !chk[j + 1])
uni(j, j + 1);
for (int j : arr[i]) {
for (int k = 0; k < val[j].size(); k++) {
X = k, Y = find(val[j][X]);
while (k + 1 < val[j].size() && find(val[j][k + 1]) == Y)
k++;
ans = ans * comb(sz[Y], k - X + 1) % MOD, sz[Y] -= k - X + 1;
chk[Y] |= sz[Y] == 0;
}
}
}
cout << ans << '\n';
return 0;
}
提出情報
コンパイルエラー
./Main.cpp: In function 'int main()':
./Main.cpp:111:31: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
111 | for (int k = 0; k < val[j].size(); k++) {
| ~~^~~~~~~~~~~~~~~
./Main.cpp:113:30: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
113 | while (k + 1 < val[j].size() && find(val[j][k + 1]) == Y)
| ~~~~~~^~~~~~~~~~~~~~~
./Main.cpp:70:30: warning: unused variable 'V' [-Wunused-variable]
70 | int N, M, ans = 1, X, Y, V, MD = 0;
| ^
ジャッジ結果
| セット名 |
Sample |
All |
| 得点 / 配点 |
0 / 0 |
900 / 900 |
| 結果 |
|
|
| セット名 |
テストケース |
| Sample |
00-sample-001.txt, 00-sample-002.txt, 00-sample-003.txt, 00-sample-004.txt |
| All |
00-sample-001.txt, 00-sample-002.txt, 00-sample-003.txt, 00-sample-004.txt, 01-001.txt, 01-002.txt, 01-003.txt, 01-004.txt, 01-005.txt, 01-006.txt, 01-007.txt, 01-008.txt, 01-009.txt, 01-010.txt, 01-011.txt, 01-012.txt, 01-013.txt, 01-014.txt, 01-015.txt, 01-016.txt, 01-017.txt, 01-018.txt, 01-019.txt, 01-020.txt, 01-021.txt, 01-022.txt, 01-023.txt, 01-024.txt, 01-025.txt, 01-026.txt, 01-027.txt, 01-028.txt, 01-029.txt, 01-030.txt, 01-031.txt, 01-032.txt, 01-033.txt, 01-034.txt, 01-035.txt, 01-036.txt |
| ケース名 |
結果 |
実行時間 |
メモリ |
| 00-sample-001.txt |
AC |
11 ms |
3680 KiB |
| 00-sample-002.txt |
AC |
11 ms |
3764 KiB |
| 00-sample-003.txt |
AC |
11 ms |
3660 KiB |
| 00-sample-004.txt |
AC |
11 ms |
3732 KiB |
| 01-001.txt |
AC |
11 ms |
3660 KiB |
| 01-002.txt |
AC |
11 ms |
3936 KiB |
| 01-003.txt |
AC |
11 ms |
3828 KiB |
| 01-004.txt |
AC |
11 ms |
4064 KiB |
| 01-005.txt |
AC |
11 ms |
3696 KiB |
| 01-006.txt |
AC |
360 ms |
135828 KiB |
| 01-007.txt |
AC |
171 ms |
96392 KiB |
| 01-008.txt |
AC |
250 ms |
115360 KiB |
| 01-009.txt |
AC |
198 ms |
103640 KiB |
| 01-010.txt |
AC |
347 ms |
117160 KiB |
| 01-011.txt |
AC |
201 ms |
103908 KiB |
| 01-012.txt |
AC |
400 ms |
118940 KiB |
| 01-013.txt |
AC |
220 ms |
103848 KiB |
| 01-014.txt |
AC |
216 ms |
104272 KiB |
| 01-015.txt |
AC |
202 ms |
104548 KiB |
| 01-016.txt |
AC |
347 ms |
119468 KiB |
| 01-017.txt |
AC |
192 ms |
103932 KiB |
| 01-018.txt |
AC |
207 ms |
104260 KiB |
| 01-019.txt |
AC |
226 ms |
104460 KiB |
| 01-020.txt |
AC |
349 ms |
119832 KiB |
| 01-021.txt |
AC |
206 ms |
103768 KiB |
| 01-022.txt |
AC |
217 ms |
104136 KiB |
| 01-023.txt |
AC |
287 ms |
118824 KiB |
| 01-024.txt |
AC |
199 ms |
100876 KiB |
| 01-025.txt |
AC |
474 ms |
126284 KiB |
| 01-026.txt |
AC |
246 ms |
106144 KiB |
| 01-027.txt |
AC |
271 ms |
109636 KiB |
| 01-028.txt |
AC |
318 ms |
138940 KiB |
| 01-029.txt |
AC |
199 ms |
138772 KiB |
| 01-030.txt |
AC |
177 ms |
139136 KiB |
| 01-031.txt |
AC |
167 ms |
140852 KiB |
| 01-032.txt |
AC |
167 ms |
142540 KiB |
| 01-033.txt |
AC |
140 ms |
119672 KiB |
| 01-034.txt |
AC |
167 ms |
128004 KiB |
| 01-035.txt |
AC |
426 ms |
126916 KiB |
| 01-036.txt |
AC |
387 ms |
135956 KiB |