Skip to content

Commit ed3d7f3

Browse files
authored
Merge pull request #1370 from NachiaVivias/chmax_add_sum_worst
[testcase] Range Chmin Chmax Add Range Sum Θ(n log^2 n)
2 parents 4791835 + a31a3d3 commit ed3d7f3

3 files changed

Lines changed: 162 additions & 0 deletions

File tree

Lines changed: 151 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,151 @@
1+
#include "random.h"
2+
#include <iostream>
3+
#include <tuple>
4+
#include <vector>
5+
#include <algorithm>
6+
#include "../params.h"
7+
8+
using namespace std;
9+
10+
using ll = long long;
11+
12+
vector<ll> get_fib(ll N){
13+
vector<ll> fib(N*2+1,1);
14+
for(ll i=2; i<=N*2; i++) fib[i] = fib[i-1] + fib[i-2];
15+
return fib;
16+
}
17+
18+
vector<ll> get_hack_sequence(ll N, const vector<ll>& fib){
19+
vector<ll> A(fib[N*2]);
20+
A[0] = 1;
21+
for(ll n=2; n<=N; n++){
22+
for(ll k=fib[n*2-2]; k<fib[n*2-2]*2; k++) A[k] = A[k-fib[n*2-2]] - fib[n*2-2];
23+
for(ll k=fib[n*2-2]*2; k<fib[n*2]; k++) A[k] = A[k-fib[n*2-1]] - fib[n*2-1];
24+
for(ll k=0; k<fib[n*2]; k++) A[k] += fib[n*2];
25+
A[fib[n*2-2]-1] = fib[n*2-1];
26+
A[fib[n*2]-1] = 0;
27+
}
28+
return A;
29+
}
30+
31+
vector<ll> get_hack_sequence_transitions(ll N, const vector<ll>& fib, vector<ll> A){
32+
vector<ll> chmax_affects;
33+
34+
for(ll k=0; k<fib[N*2-1]; k++) A[k] -= fib[N*2-2];
35+
for(ll k=fib[N*2-1]; k<fib[N*2]; k++) A[k] += fib[N*2-1];
36+
for(ll k=0; k<fib[N*2]; k++) if(A[k] <= fib[N*2-1]) chmax_affects.push_back(A[k]);
37+
for(ll k=0; k<fib[N*2]; k++) A[k] = max(A[k], fib[N*2-1]);
38+
39+
sort(chmax_affects.begin(), chmax_affects.end());
40+
chmax_affects.erase(unique(chmax_affects.begin(), chmax_affects.end()), chmax_affects.end());
41+
42+
A[fib[N*2-1]-1] = 0;
43+
44+
rotate(A.begin(), A.begin() + fib[N*2-1], A.end());
45+
return chmax_affects;
46+
}
47+
48+
struct Query {
49+
ll ty, l, r, x;
50+
};
51+
52+
struct Problem {
53+
vector<ll> initial;
54+
vector<Query> queries;
55+
};
56+
57+
Problem get_hack_query_sequence(ll max_n, ll max_q, ll K, ll hack_interval_lg2){
58+
ll hack_interval = 1ll << hack_interval_lg2;
59+
60+
auto fib = get_fib(K);
61+
auto hack_seq = get_hack_sequence(K, fib);
62+
auto tr = get_hack_sequence_transitions(K, fib, hack_seq);
63+
64+
ll hack_len = hack_seq.size();
65+
ll hack_binsize = 1; while(hack_binsize < hack_len) hack_binsize *= 2;
66+
67+
68+
ll N = hack_len;
69+
ll interval_num = 1;
70+
while(N + hack_interval < max_n){
71+
interval_num += 1;
72+
N += hack_interval;
73+
}
74+
75+
vector<ll> A(N, tr.back());
76+
for(ll u=0; u<interval_num; u++){
77+
for(ll v=0; v<hack_len; v++){
78+
A[u*hack_interval+v] = hack_seq[v];
79+
}
80+
}
81+
82+
vector<Query> queries;
83+
auto push = [&](Query q){
84+
if((ll)queries.size() == max_q) return;
85+
queries.push_back(q);
86+
};
87+
88+
ll cy = 0;
89+
while((ll)queries.size() < max_q){
90+
91+
if(cy < fib[K*2-2]){
92+
push({ 2, 0, N, fib[K*2-1] });
93+
for(ll offset=0; offset<interval_num*hack_interval; offset+=hack_interval){
94+
push({ 2, offset + cy, offset + (cy + fib[K*2-1]) % hack_len, -fib[K*2] });
95+
}
96+
} else {
97+
push({ 2, 0, N, -fib[K*2-2] });
98+
for(ll offset=0; offset<interval_num*hack_interval; offset+=hack_interval){
99+
push({ 2, offset + (cy + fib[K*2-1]) % hack_len, offset + cy, fib[K*2] });
100+
}
101+
}
102+
103+
for(ll t=1; t<(ll)tr.size(); t++){
104+
push({ 1, 0, N, tr[t] });
105+
}
106+
107+
for(ll offset=0; offset<interval_num*hack_interval; offset+=hack_interval){
108+
ll zeroing_pos = (cy + fib[K*2-1] - 1) % hack_len;
109+
push({ 0, offset + zeroing_pos, offset + zeroing_pos + 1, 0 });
110+
}
111+
112+
cy = (cy + fib[K*2-1]) % hack_len;
113+
}
114+
115+
return { A, queries };
116+
}
117+
118+
int main(int, char* argv[]) {
119+
long long seed = atoll(argv[1]);
120+
auto gen = Random(seed);
121+
122+
ll num_sumquery = N_AND_Q_MAX / 100;
123+
124+
Problem problem = get_hack_query_sequence(N_AND_Q_MAX, N_AND_Q_MAX - num_sumquery, 5 + seed % 2 * 2, 15 - seed / 2 * 2);
125+
126+
ll N = problem.initial.size();
127+
ll Q = problem.queries.size() + num_sumquery;
128+
129+
vector<ll> query_type(Q);
130+
for(ll i : gen.choice<ll>(num_sumquery, 0, Q-1)) query_type[i] = 1;
131+
ll hack_query_ptr = 0;
132+
133+
printf("%lld %lld\n", N, Q);
134+
135+
for(ll i=0; i<N; i++){
136+
if(i) printf(" ");
137+
printf("%lld", problem.initial[i]);
138+
} printf("\n");
139+
140+
for(ll i=0; i<Q; i++){
141+
if(query_type[i] == 0){
142+
Query q = problem.queries[hack_query_ptr++];
143+
printf("%lld %lld %lld %lld\n", q.ty, q.l, q.r, q.x);
144+
} else {
145+
auto [l,r] = gen.uniform_pair<ll>(0, N);
146+
printf("3 %lld %lld\n", l, r);
147+
}
148+
}
149+
150+
return 0;
151+
}

data_structure/range_chmin_chmax_add_range_sum/hash.json

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,14 @@
11
{
22
"example_00.in": "8691e362b7409e5566abe9cdf2ba2d1659b46edef70dabbe485f750c3f185cfc",
33
"example_00.out": "a98cad4d512832ba33f51cab84fb6a1a91ebccda726f28a96b95fbb5eb04caba",
4+
"issue_1369_log2_00.in": "47566a7b9ba63dc64770ad583a305aee7809af1064a6166e5ce3329b3d10faef",
5+
"issue_1369_log2_00.out": "81d4aadacd9bf414e181206afe5e1c725b3f2e771d52fcaafd997c248cafce52",
6+
"issue_1369_log2_01.in": "93f8a1806e44435903d5d2ab882f345113d8bf6382dc87982d7cdec5be03cd95",
7+
"issue_1369_log2_01.out": "6da2226112cd90f9e239d8498cd081557b5eae9f32d600b26c12330f1316c0ac",
8+
"issue_1369_log2_02.in": "5772b9f4be3f8463a72838c9f936fc030d17f9f3546c91861a306abeb214f152",
9+
"issue_1369_log2_02.out": "e82c67ddcc9260f0274a94a618a80e6db0093becc5fab7c3c76ef7355399b2f7",
10+
"issue_1369_log2_03.in": "7eabe75c8fd7b1bc85eeeee14d61910c24924b39fbfe1d8e0dd5d527bbc0d91b",
11+
"issue_1369_log2_03.out": "2faaaa019455bd3cc01f941f0933d71775019dce54a0d569b664a8ac20dc7f7e",
412
"max_random_00.in": "88ef2e3d9ff2762f1cacf7c015dd448eef36f1a3d6141f78dafcab1e46371119",
513
"max_random_00.out": "5be67565dff85860d6424d3e12cd0ed863299d57e711927a6db9bb981daa4136",
614
"max_random_01.in": "93aa493b7b14c24900b948662dde55df110a4af05be9024cf765a05c3bc36129",

data_structure/range_chmin_chmax_add_range_sum/info.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@ forum = "https://github.com/yosupo06/library-checker-problems/issues/243"
2626
[[tests]]
2727
name = "small_absolute_values.cpp"
2828
number = 3
29+
[[tests]]
30+
name = "issue_1369_log2.cpp"
31+
number = 4
2932

3033
[[solutions]]
3134
name = "correct_with_assert.cpp"

0 commit comments

Comments
 (0)