QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#620552 | #8527. Power Divisions | badminton | WA | 9ms | 22352kb | C++14 | 3.2kb | 2024-10-07 19:10:48 | 2024-10-07 19:10:49 |
Judging History
answer
#include "bits/stdc++.h"
using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair <ll,ll> pll;
typedef pair <int,int> pii;
typedef pair <int,pii> piii;
#define forr(_a,_b,_c) for(int _a = (_b); _a <= int (_c); ++_a)
#define ford(_a,_b,_c) for(int _a = (_b) + 1; _a --> int (_c);)
#define forf(_a,_b,_c) for(int _a = (_b); _a < int (_c); ++_a)
#define st first
#define nd second
#define pb push_back
#define mp make_pair
#define all(x) begin(x),end(x)
#define mask(i) (1LL << (i))
#define bit(x, i) (((x) >> (i)) & 1)
#define bp __builtin_popcountll
#define file "test"
template<class X, class Y>
bool minz(X &x, const Y &y) {
if (x > y) {
x = y;
return true;
} return false;
}
template<class X, class Y>
bool maxz(X &x, const Y &y) {
if (x < y) {
x = y;
return true;
} return false;
}
const int N = 1e6 + 50;
const ll oo = (ll) 1e16;
const ll mod = 1e9 + 7; // 998244353;
ll rd (ll l, ll r){
ll res = 0;
for (int i = 0; i < 4; i++)
res = (res << 15) ^ rand();
return res;
}
void add (ll &u, ll v){
u += v;
if (u >= mod)
u -= mod;
}
ll a[N], n, cur, pre[N], pw[N];
ll dp[N], mn, mx;
map <int, int> bit;
void addbit (int x){
cur ^= pw[x];
bit[x]++;
while (bit[x] > 1){
bit[x] -= 2;
if (mn == x)
mn++;
bit[++x]++;
cur ^= pw[x];
}
maxz(mx, x);
}
void solve (int l, int r){
if (l == r){
add(dp[l], dp[l - 1]);
// cout <<l << " " << r << " " << dp[l] << " zz\n";
return;
}
int mid = (l + r) >> 1;
solve(l, mid);
map <ll, ll> g, f;
cur = 0;
mn = mx = a[mid];
bit.clear();
//cout << l << " " << r << ":\n";
ford (i, mid, l){
addbit(a[i]);
add(f[cur], dp[i - 1]);
ll x = pre[mx] ^ (mn == 0 ? 0 : pre[mn - 1]) ^ pw[mn] ^ cur;
if (x != cur)
add(g[x], dp[i - 1]);
//cout << i << " " << mid << " " << mn << " " << mx << " " << cur << " " << x << " " << dp[i - 1] << "\n";
}
// cout << "--\n";
cur = 0;
mn = mx = a[mid + 1];
bit.clear();
forr (i, mid + 1, r){
addbit(a[i]);
ll x = pre[mx] ^ (mn == 0 ? 0 : pre[mn - 1]) ^ pw[mn] ^ cur;
add(dp[i], g[cur]);
add(dp[i], f[x]);
//cout << mid + 1 << " " << i << " " << mn << " " << mx << " " << cur << " " << dp[i] << "\n";
//cout << x << " " << pre[mx] << " " << pw[mx] << "\n";
}
solve(mid + 1, r);
}
int main(){
ios_base::sync_with_stdio(0); cin.tie(0);
#ifdef hqm
freopen(file".inp", "r", stdin); freopen(file".out", "w", stdout);
#endif
srand(time(NULL));
cin >> n;
forr (i, 1, n){
cin >> a[i];
}
pw[0] = pre[0] = rand();
forr (i, 1, 1000021){
pw[i] = rand();
pre[i] = pre[i - 1] ^ pw[i];
}
dp[0] = 1;
solve(1, n);
// forr (i, 0, n){
// cout << dp[i] << " " << pw[i] << "\n";
// }
cout << dp[n] << "\n";
return 0;
}
/*
*/
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 4ms
memory: 22352kb
input:
5 2 0 0 1 1
output:
6
result:
ok 1 number(s): "6"
Test #2:
score: 0
Accepted
time: 7ms
memory: 22048kb
input:
1 0
output:
1
result:
ok 1 number(s): "1"
Test #3:
score: 0
Accepted
time: 6ms
memory: 22336kb
input:
2 1 1
output:
2
result:
ok 1 number(s): "2"
Test #4:
score: 0
Accepted
time: 0ms
memory: 22336kb
input:
3 2 1 1
output:
3
result:
ok 1 number(s): "3"
Test #5:
score: 0
Accepted
time: 9ms
memory: 22108kb
input:
4 3 2 2 3
output:
4
result:
ok 1 number(s): "4"
Test #6:
score: 0
Accepted
time: 8ms
memory: 22048kb
input:
5 3 4 4 2 4
output:
2
result:
ok 1 number(s): "2"
Test #7:
score: -100
Wrong Answer
time: 0ms
memory: 22112kb
input:
7 3 4 3 5 6 3 4
output:
3
result:
wrong answer 1st numbers differ - expected: '6', found: '3'