QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#458694#8527. Power Divisionsucup-team2172WA 3160ms170496kbC++235.0kb2024-06-29 18:28:362024-06-29 18:28:36

Judging History

This is the latest submission verdict.

  • [2024-06-29 18:28:36]
  • Judged
  • Verdict: WA
  • Time: 3160ms
  • Memory: 170496kb
  • [2024-06-29 18:28:36]
  • Submitted

answer

#include <bits/stdc++.h>
#define inf (0x7f7f7f7f)
#define Min(a, b) ((a) < (b) ? (a) : (b))
#define Max(a, b) ((a) > (b) ? (a) : (b))
typedef long long ll;
using namespace std;
template <class T>
inline void read(T &x){
	int ch = 0, f = 0; x = 0;
	for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = 1;
	for(; isdigit(ch); ch = getchar()) x = x * 10 + ch - 48;
	if(f) x = -x;
}
const int N = 2e6 + 1e5, M = 1e9 + 9, M2 = 998244353, lim = 2e6 + 1e4, mod = 1e9 + 7;
int a[N], pw[N], pw2[N], pre2[N], pre[N], dp[N];
vector<int> stk[N];
pair<int, int> hsa[N], hsb[N];
int n;

#define fi first
#define se second

namespace seg{
	#define lson (u << 1)
	#define rson (u << 1 | 1)
	#define mid ((l + r) >> 1)
	pair<int, int> hash[N<<2];
	int low[N<<2], high[N<<2];
	inline void build(int u, int l, int r){
		hash[u] = make_pair(0, 0), low[u] = lim + 1, high[u] = 0;
		if(l == r) return;
		build(lson, l, mid), build(rson, mid + 1, r);
	}
	inline void update(int u, int l, int r){
		low[u] = min(low[lson], low[rson]);
		high[u] = max(high[lson], high[rson]);
		hash[u].fi = (hash[lson].fi + 1ll * hash[rson].fi * pw[mid-l+1] % M) % M;
		hash[u].se = (hash[lson].se + 1ll * hash[rson].se * pw2[mid-l+1] % M2) % M2;
	}
	inline void modify(int u, int l, int r, int pos, int x){
		if(l == r){
			if(x) low[u] = high[u] = l;
			else low[u] = n + 1, high[u] = 0;
			return (void) (hash[u] = make_pair(233 * x, 97 * x));
		}
		if(pos <= mid) modify(lson, l, mid, pos, x);
		else modify(rson, mid + 1, r, pos, x);
		update(u, l, r);
	}
	inline int query(int u, int l, int r, int pos){
		if(l == r) return hash[u].fi > 0 && hash[u].se > 0;
		if(pos <= mid) return query(lson, l, mid, pos);
		else return query(rson, mid + 1, r, pos);
	}
	inline void clear(int u, int l, int r){
		hash[u] = make_pair(0, 0), low[u] = lim + 1, high[u] = 0;
		if(high[lson]) clear(lson, l, mid);
		if(high[rson]) clear(rson, mid + 1, r);
	}
	#undef mid
}

inline void add_bit(int x){
	while(seg::query(1, 1, lim, x)){
		seg::modify(1, 1, lim, x, 0);
		x++;
	}
	seg::modify(1, 1, lim, x, 1);
}



inline void solve(int l, int r){
	if(l == r){
		stk[l].push_back(l);
		return;
	}

	int mid = ((l + r) >> 1);
	seg::clear(1, 1, lim);
	vector<pair<int, int> > vec;
	for(int i = mid; i >= l; i--){
		add_bit(a[i]);
		int val1 = seg::hash[1].fi, low = seg::low[1];
		int val2 = seg::hash[1].se;
		val1 = (val1 + (M - pw[low])) % M;
		val2 = (val2 + (M2 - pw2[low])) % M2;
		int bval = 1ll * pre[seg::high[1]-low] * pw[low] % M;
		int bval2 = 1ll * pre2[seg::high[1]-low] * pw2[low] % M2;
		bval = (bval + M - val1) % M;
		bval2 = (bval2 + M2 - val2) % M2;
		hsa[i] = make_pair(val1, val2), hsb[i] = make_pair(bval, bval2);
		vec.push_back(make_pair(low, i));
	}
	
	seg::clear(1, 1, lim);

	for(int i = mid + 1; i <= r; i++){
		add_bit(a[i]);
		int val1 = seg::hash[1].fi, low = seg::low[1];
		int val2 = seg::hash[1].se;
		
		val1 = (val1 + (M - pw[low])) % M;
		val2 = (val2 + (M2 - pw2[low])) % M2;
		
		int bval = 1ll * pre[seg::high[1]-low] * pw[low] % M;
		int bval2 = 1ll * pre2[seg::high[1]-low] * pw2[low] % M2;
		
		bval = (bval + M - val1) % M;
		bval2 = (bval2 + M2 - val2) % M2;
		
		hsa[i] = make_pair(val1, val2), hsb[i] = make_pair(bval, bval2);
		vec.push_back(make_pair(low, i));
	}

	sort(vec.begin(), vec.end());
			
	for(int i = 0, j; i < (int) vec.size();){
		vector<pair<pair<int, int>, int> > vecl, vecr;
		
		for(j = i; vec[j].fi == vec[i].fi && j < (int) vec.size(); j++){
			if(vec[j].se <= mid) vecl.push_back(make_pair(hsa[vec[j].se], vec[j].se));
			else vecr.push_back(make_pair(hsa[vec[j].se], vec[j].se));
		}		
		sort(vecl.begin(), vecl.end());
		sort(vecr.begin(), vecr.end());
		
		for(j = i; vec[j].fi == vec[i].fi && j < (int) vec.size(); j++){
			pair<int, int> val = hsb[vec[j].se];
			if(vec[j].se <= mid){
				int L = lower_bound(vecr.begin(), vecr.end(), make_pair(val, 0)) - vecr.begin();
				int R = lower_bound(vecr.begin(), vecr.end(), make_pair(val, inf)) - vecr.begin() - 1;
				for(int k = L; k <= R; k++) stk[vecr[k].se].push_back(vec[j].se);
			}
			else{
				int L = lower_bound(vecl.begin(), vecl.end(), make_pair(val, 0)) - vecl.begin();
				int R = lower_bound(vecl.begin(), vecl.end(), make_pair(val, inf)) - vecl.begin() - 1;
				for(int k = L; k <= R; k++) stk[vec[j].se].push_back(vecl[k].se);
			}
		}
		i = j;
	}
	
	
	solve(l, mid);
	solve(mid + 1, r);

}


int main(){
	read(n);
	for(int i = 1; i <= n; i++) read(a[i]), a[i]++;
	pw[0] = pw2[0] = 1;
	for(int i = 1; i <= lim; i++){
		pw[i] = 233ll * pw[i-1] % M;
		pw2[i] = 97ll * pw2[i-1] % M2;
		pre[i] = (pre[i-1] + pw[i]) % M;
		pre2[i] = (pre2[i-1] + pw2[i]) % M2;
		
	}
	seg::build(1, 1, lim);
	solve(1, n);
	
	dp[0] = 1;
	for(int i = 1; i <= n; i++){
		sort(stk[i].begin(), stk[i].end());
		for(int j = 0; j < (int) stk[i].size(); j++){
			if(j == 0 || stk[i][j] != stk[i][j-1]){
				dp[i] = (dp[i] + dp[stk[i][j]-1]) % mod;
			}
		}
	}
	cout << dp[n] << endl;
	return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 25ms
memory: 113252kb

input:

5
2 0 0 1 1

output:

6

result:

ok 1 number(s): "6"

Test #2:

score: 0
Accepted
time: 19ms
memory: 110816kb

input:

1
0

output:

1

result:

ok 1 number(s): "1"

Test #3:

score: 0
Accepted
time: 20ms
memory: 112584kb

input:

2
1 1

output:

2

result:

ok 1 number(s): "2"

Test #4:

score: 0
Accepted
time: 19ms
memory: 112324kb

input:

3
2 1 1

output:

3

result:

ok 1 number(s): "3"

Test #5:

score: 0
Accepted
time: 23ms
memory: 115224kb

input:

4
3 2 2 3

output:

4

result:

ok 1 number(s): "4"

Test #6:

score: 0
Accepted
time: 12ms
memory: 112924kb

input:

5
3 4 4 2 4

output:

2

result:

ok 1 number(s): "2"

Test #7:

score: 0
Accepted
time: 19ms
memory: 115052kb

input:

7
3 4 3 5 6 3 4

output:

6

result:

ok 1 number(s): "6"

Test #8:

score: 0
Accepted
time: 23ms
memory: 113752kb

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: 23ms
memory: 114328kb

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: 26ms
memory: 113920kb

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: 23ms
memory: 115688kb

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: 99ms
memory: 116064kb

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: 478ms
memory: 119056kb

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: 2783ms
memory: 141256kb

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: 2657ms
memory: 170496kb

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
Wrong Answer
time: 3160ms
memory: 139228kb

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...

output:

977976845

result:

wrong answer 1st numbers differ - expected: '432100269', found: '977976845'