QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#699765 | #8527. Power Divisions | georgeyucjr | RE | 1727ms | 35436kb | C++17 | 5.4kb | 2024-11-02 10:40:06 | 2024-11-02 10:40:07 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
// hashmap.cpp
#include <bits/stdc++.h>
#ifndef cpp17_inline_v
#if __cplusplus >= 201700LL
#define cpp17_inline_v inline
#else
#define cpp17_inline_v
#endif
#endif
// based on andyli
// unordered_map
template <typename T, const int _lg>
struct umap {
static const uint64_t rng;
cpp17_inline_v static constexpr int N = 1 << _lg;
using key_type = uint64_t;
key_type* Key = new key_type[N];
T* val = new T[N];
std::vector<int> ls;
std::bitset<N> vis;
inline static uint32_t gethash(key_type x) {
return (key_type(x + rng) * 11995408973635179863ULL) >> (64 - _lg);
}
int get_idx(key_type val) const {
int i = gethash(val);
while (vis[i] && Key[i] != val) i = (i + 1) & (N - 1);
return i;
}
T& operator[](key_type _val) {
int i = get_idx(_val);
if (!vis[i]) {
vis[i] = true;
Key[i] = _val;
val[i] = {};
}
return val[i];
}
T getval(key_type _val, T not_exist) const {
auto i = get_idx(_val);
return vis[i] ? val[i] : not_exist;
}
bool count(key_type val) const {
int i = get_idx(val);
return vis[i];
}
void clearall() { vis.reset(); }
~umap() { delete[] Key, delete[] val; }
};
template <typename T, const int _lg>
const uint64_t umap<T, _lg>::rng =
std::chrono::steady_clock::now().time_since_epoch().count();
template <typename T, const int _lg>
struct umap_safe {
static const uint64_t rng;
static constexpr int N = 1 << _lg;
using key_type = uint64_t;
key_type* Key = new key_type[N];
T* val = new T[N];
std::vector<int> ls;
std::bitset<N> vis;
std::vector<int> vc;
static uint32_t gethash(key_type x) {
return (key_type(x + rng) * 11995408973635179863ULL) >> (64 - _lg);
}
int get_idx(key_type val) const {
int i = gethash(val);
while (vis[i] && Key[i] != val) i = (i + 1) & (N - 1);
return i;
}
T& operator[](key_type _val) {
int i = get_idx(_val);
if (!vis[i]) {
vis[i] = true;
Key[i] = _val;
val[i] = {};
vc.emplace_back(i);
}
return val[i];
}
T getval(key_type _val, T not_exist) const {
auto i = get_idx(_val);
return vis[i] ? val[i] : not_exist;
}
bool count(key_type val) const {
int i = get_idx(val);
return vis[i];
}
void clearall() {
vis.reset();
vc.clear();
}
void foorall(auto&& f) {
for (auto x : vc) f(Key[x], val[x]);
}
~umap_safe() { delete[] Key, delete[] val; }
};
template <typename T, const int _lg>
const uint64_t umap_safe<T, _lg>::rng =
std::chrono::steady_clock::now().time_since_epoch().count();
#define rep(i, f, t, ...) for (int i = f, ##__VA_ARGS__; i <= t; ++i)
#define per(i, f, t, ...) for (int i = f, ##__VA_ARGS__; i >= t; --i)
using ll = long long;
using ull = unsigned long long;
template <typename T>
constexpr inline T inf = numeric_limits<T>::max() / 2;
constexpr int N = 3e5 + 105;
constexpr int MM = 1e6 + 5;
constexpr ll mod = 1e9 + 7;
int n, m, a[N];
ll dp[N];
mt19937 mrand(chrono::steady_clock::now().time_since_epoch().count());
mt19937_64 m64rand(chrono::steady_clock::now().time_since_epoch().count());
namespace NH {
ull val[MM], val_sum[MM], cur = 0;
int cnt[MM], mn, mx, Lim;
void init(int lim = m + 30) {
Lim = lim;
rep(i, 0, lim) val[i] = m64rand(); val_sum[0] = 0;
partial_sum(val, val + lim + 1, val_sum + 1,
[&](auto&& u, auto&& v) { return u ^ v; });
// rep(i, 0, lim) cerr << val[i] << "\n";
cur = 0;
}
void clear() {
assert(!cur);
mn = Lim, mx = -1;
}
void add(int x) {
// assert(x <= m + 3);
for (; cnt[x]; ++x) {
--cnt[x], cur ^= val[x];
if (mn == x) ++mn;
}
++cnt[x];
cur ^= val[x];
mx = max(mx, x), mn = min(mn, x);
}
void del(int x) {
for (; !cnt[x]; ++x) ++cnt[x], cur ^= val[x];
--cnt[x], cur ^= val[x];
}
ull qry() {
assert(mn <= mx);
return cur ^ val_sum[mn + 1] ^ val_sum[mx + 1];
}
} // namespace NH
void add_mod(ll& x) {
if (x >= mod) x -= mod;
}
void dvd(int l, int r) { // [l, r)
if (l + 1 == r) return dp[r] += dp[l], add_mod(dp[r]);
int mid = (l + r) >> 1;
dvd(l, mid);
// less
{
umap_safe<ll, 20> M;
NH::clear();
per(i, mid - 1, l) NH::add(a[i]), M[NH::cur] += dp[i], add_mod(M[NH::cur]); // cerr << M[NH::cur] << " " << dp[i] << "\n";
rep(i, l, mid - 1) NH::del(a[i]);
NH::clear();
rep(i, mid, r - 1) {
NH::add(a[i]);
if (NH::mn < NH::mx) {
ll fd = M.getval(NH::qry(), -1);
// cerr << "found " << fd << "\n";
if (fd != -1) add_mod(dp[i + 1] += fd);
}
}
per(i, r - 1, mid) NH::del(a[i]);
}
// equal or greater
{
umap_safe<ll, 20> M;
NH::clear();
per(i, mid - 1, l) NH::add(a[i]), add_mod(M[NH::qry()] += dp[i]); // cerr << M[NH::qry()] << " " << dp[i] << "\n";
rep(i, l, mid - 1) NH::del(a[i]);
NH::clear();
rep(i, mid, r - 1) {
NH::add(a[i]);
ll fd = M.getval(NH::cur, -1);
// cerr << "found " << fd << "\n";
if (fd != -1) add_mod(dp[i + 1] += fd);
}
per(i, r - 1, mid) NH::del(a[i]);
}
dvd(mid, r);
}
signed main() {
cin.tie(0)->sync_with_stdio(0);
cin >> n;
rep(i, 0, n - 1) cin >> a[i];
m = *max_element(a, a + n);
dp[0] = 1;
NH::init();
dvd(0, n);
cout << dp[n] << "\n";
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 0ms
memory: 14744kb
input:
5 2 0 0 1 1
output:
6
result:
ok 1 number(s): "6"
Test #2:
score: 0
Accepted
time: 2ms
memory: 12088kb
input:
1 0
output:
1
result:
ok 1 number(s): "1"
Test #3:
score: 0
Accepted
time: 0ms
memory: 14228kb
input:
2 1 1
output:
2
result:
ok 1 number(s): "2"
Test #4:
score: 0
Accepted
time: 0ms
memory: 16172kb
input:
3 2 1 1
output:
3
result:
ok 1 number(s): "3"
Test #5:
score: 0
Accepted
time: 0ms
memory: 18696kb
input:
4 3 2 2 3
output:
4
result:
ok 1 number(s): "4"
Test #6:
score: 0
Accepted
time: 0ms
memory: 25144kb
input:
5 3 4 4 2 4
output:
2
result:
ok 1 number(s): "2"
Test #7:
score: 0
Accepted
time: 0ms
memory: 24884kb
input:
7 3 4 3 5 6 3 4
output:
6
result:
ok 1 number(s): "6"
Test #8:
score: 0
Accepted
time: 0ms
memory: 23144kb
input:
10 8 6 5 6 7 8 6 8 9 9
output:
4
result:
ok 1 number(s): "4"
Test #9:
score: 0
Accepted
time: 2ms
memory: 24288kb
input:
96 5 1 0 2 5 5 2 4 2 4 4 2 3 4 0 2 1 4 3 1 2 0 2 2 3 2 4 5 3 5 2 0 2 2 5 3 0 4 5 3 5 4 4 3 1 2 0 5 4 5 0 2 3 2 4 0 0 4 2 0 2 5 3 3 1 5 5 1 1 1 0 5 0 3 0 2 1 1 0 5 0 3 3 4 4 5 3 0 2 2 0 5 4 5 0 5
output:
11332014
result:
ok 1 number(s): "11332014"
Test #10:
score: 0
Accepted
time: 0ms
memory: 26112kb
input:
480 2 0 4 4 1 0 0 3 1 1 4 2 5 5 4 2 1 2 4 4 1 3 4 3 0 5 2 0 2 5 1 0 5 0 0 5 5 0 2 5 2 2 3 1 4 3 5 4 5 2 4 4 4 4 1 4 0 3 4 3 4 1 0 4 3 4 5 4 3 5 0 2 2 0 1 5 4 4 2 0 3 3 3 4 3 0 5 5 3 1 5 1 0 1 0 4 3 0 5 1 4 1 4 3 0 1 3 5 0 3 3 1 0 4 1 1 2 0 1 2 0 3 5 2 0 5 5 5 5 3 5 1 0 2 5 2 2 0 2 0 2 3 5 1 2 1 5 4 ...
output:
506782981
result:
ok 1 number(s): "506782981"
Test #11:
score: 0
Accepted
time: 11ms
memory: 28908kb
input:
2400 0 2 2 0 5 4 3 2 3 2 5 4 5 4 4 5 2 2 4 2 2 0 1 0 5 0 4 4 0 0 5 0 4 0 1 3 4 5 0 3 1 0 4 0 2 5 0 3 3 3 3 1 0 5 5 3 1 3 5 2 4 0 5 0 4 5 4 2 2 1 5 2 2 4 1 0 5 1 5 0 1 2 0 0 3 5 4 0 0 1 1 1 4 2 0 5 1 3 3 5 0 4 4 1 5 5 3 4 4 4 0 2 4 0 5 1 3 1 5 0 5 5 1 3 0 3 1 2 0 1 1 3 5 2 3 4 0 3 0 5 4 0 4 3 5 0 5 2...
output:
586570528
result:
ok 1 number(s): "586570528"
Test #12:
score: 0
Accepted
time: 67ms
memory: 29916kb
input:
12000 2 2 1 2 0 2 5 3 2 0 1 3 2 5 4 0 0 5 3 2 0 2 3 4 3 2 1 4 3 0 3 5 4 1 0 2 4 1 3 2 3 5 0 3 0 0 4 0 4 5 1 0 4 1 1 1 5 4 3 0 3 5 4 5 2 5 0 1 2 3 5 5 2 5 4 2 0 4 4 3 0 0 2 5 0 3 4 2 5 4 2 1 4 5 1 1 2 3 0 3 3 3 3 4 0 5 3 4 0 3 0 2 0 0 2 0 3 4 2 2 0 1 0 5 3 0 2 0 2 2 1 0 5 3 5 4 5 5 0 4 0 4 1 4 4 3 2 ...
output:
201653965
result:
ok 1 number(s): "201653965"
Test #13:
score: 0
Accepted
time: 334ms
memory: 32632kb
input:
60000 2 5 0 3 2 3 5 3 5 5 4 1 1 5 3 0 1 1 2 5 5 5 0 3 2 0 3 2 3 3 0 0 1 4 3 1 4 2 3 3 0 5 1 0 1 1 5 5 4 0 5 4 1 3 1 3 5 3 2 4 4 4 5 4 3 2 3 2 4 5 2 0 4 5 1 2 0 4 0 5 1 3 4 1 2 4 1 1 3 3 0 1 1 3 0 0 2 3 3 2 1 4 1 2 4 3 3 5 2 5 3 4 3 0 2 1 1 1 5 1 2 4 2 3 1 2 1 0 2 0 1 1 5 5 3 4 2 5 2 4 5 3 0 5 1 4 2 ...
output:
592751350
result:
ok 1 number(s): "592751350"
Test #14:
score: 0
Accepted
time: 1727ms
memory: 34820kb
input:
300000 0 5 1 5 5 4 5 3 0 5 0 5 1 4 1 2 2 2 3 0 1 5 4 0 3 1 4 5 2 1 0 3 2 1 2 5 0 2 4 5 0 1 2 1 1 0 0 5 3 0 0 3 4 5 0 2 1 1 1 2 5 1 4 3 1 0 2 0 0 4 3 3 2 5 3 3 1 5 2 0 2 4 3 1 0 3 4 1 3 3 1 0 0 1 1 1 3 1 2 3 5 3 3 2 0 3 0 0 5 5 0 0 0 0 1 4 3 3 4 3 4 5 3 3 5 1 1 4 2 2 1 3 2 1 1 0 0 5 5 0 0 3 2 4 5 5 2...
output:
842503795
result:
ok 1 number(s): "842503795"
Test #15:
score: 0
Accepted
time: 1575ms
memory: 35436kb
input:
300000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0...
output:
432100269
result:
ok 1 number(s): "432100269"
Test #16:
score: -100
Runtime Error
input:
300000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 10000...