QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#453829 | #8527. Power Divisions | ucup-team3678 | WA | 7ms | 34580kb | C++14 | 2.7kb | 2024-06-24 12:34:38 | 2024-06-24 12:34:45 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
const int N = 3e5 + 5, LIM = 1e6 + 20, P = 1e9 + 7;
const long long MOD = (1ll << 62) - 57;
const __int128 MOD2 = (__int128)"8507059173023461586583651857942052727";
int a[N], f[N];
pair<int, int> mx[20][N];
long long pw[LIM], s[N];
__int128 pw2[LIM], s2[N];
unordered_map<long long, vector<int> > M;
void solve(int l, int r) {
if (l > r) return;
if (l == r) {
((f[r] += f[l - 1]) >= P) && (f[r] -= P);
return;
}
int k = log2(r - l + 1), val, pos;
tie(val, pos) = max(mx[k][l], mx[k][r - (1 << k) + 1]);
solve(l, pos - 1);
if (r - pos < pos - l) {
for (int i = pos; i <= r; ++i) {
for (int j = val; j < val + 20; ++j) {
if (M.count(s[i] - pw[j] < 0 ? s[i] - pw[j] + MOD : s[i] - pw[j])) {
for (auto t : M[s[i] - pw[j] < 0 ? s[i] - pw[j] + MOD : s[i] - pw[j]]) {
--t;
if (t >= l && t <= pos && (s2[i] - s2[t - 1] < 0 ? s2[i] - s2[t - 1] + MOD2 : s2[i] - s2[t - 1]) == pw2[j]) {
((f[i] += f[t - 1]) >= P) && (f[i] -= P);
}
}
}
}
}
} else {
for (int i = l; i <= pos; ++i) {
for (int j = val; j < val + 20; ++j) {
if (M.count(s[i - 1] + pw[j] >= MOD ? s[i - 1] + pw[j] - MOD : s[i - 1] + pw[j])) {
for (auto t : M[s[i - 1] + pw[j] >= MOD ? s[i - 1] + pw[j] - MOD : s[i - 1] + pw[j]]) {
if (t >= pos && t <= r && (s2[t] - s2[i - 1] < 0 ? s2[t] - s2[i - 1] + MOD2 : s2[t] - s2[i - 1]) == pw2[j]) {
((f[t] += f[i - 1]) >= P) && (f[t] -= P);
}
}
}
}
}
}
solve(pos + 1, r);
}
signed main() {
int n; scanf("%d", &n);
for (int i = pw[0] = pw2[0] = 1; i < LIM; ++i) {
((pw[i] = pw[i - 1] << 1) >= MOD) && (pw[i] -= MOD);
((pw2[i] = pw2[i - 1] << 1) >= MOD2) && (pw2[i] -= MOD2);
}
for (int i = 1, x; i <= n; ++i) {
scanf("%d", &x), a[i] = x;
mx[0][i] = make_pair(a[i], i);
((s[i] = s[i - 1] + pw[a[i]]) >= MOD) && (s[i] -= MOD);
((s2[i] = s2[i - 1] + pw2[a[i]]) >= MOD2) && (s2[i] -= MOD2);
M[s[i - 1]].push_back(i - 1);
}
M[s[n]].push_back(n);
for (int i = 1; (1 << i) <= n; ++i) {
for (int j = 1; j + (1 << i) - 1 <= n; ++j) {
mx[i][j] = max(mx[i - 1][j], mx[i - 1][j + (1 << (i - 1))]);
}
}
f[0] = 1;
solve(1, n);
printf("%d\n", f[n]);
return 0;
}
详细
Test #1:
score: 0
Wrong Answer
time: 7ms
memory: 34580kb
input:
5 2 0 0 1 1
output:
0
result:
wrong answer 1st numbers differ - expected: '6', found: '0'