Skip to content

Commit a7c6351

Browse files
feat: add cpp solution for lc No.3655 (#5144)
1 parent 306eab1 commit a7c6351

3 files changed

Lines changed: 246 additions & 2 deletions

File tree

solution/3600-3699/3655.XOR After Range Multiplication Queries II/README.md

Lines changed: 82 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,88 @@ tags:
109109
#### C++
110110

111111
```cpp
112-
112+
class Solution {
113+
static constexpr int MOD = 1000000007;
114+
115+
long long modpow(long long a, long long e) {
116+
long long r = 1 % MOD;
117+
a %= MOD;
118+
while (e > 0) {
119+
if (e & 1) { r = (r * a) % MOD; }
120+
a = (a * a) % MOD;
121+
e >>= 1;
122+
}
123+
return r;
124+
}
125+
126+
public:
127+
int xorAfterQueries(vector<int>& nums, vector<vector<int>>& queries) {
128+
int n = nums.size();
129+
int B = sqrt(n) + 1;
130+
131+
vector<vector<vector<pair<int, int>>>> events(B + 1);
132+
for (int k = 1; k <= B; ++k) {
133+
events[k].resize(k);
134+
}
135+
136+
for (auto& qq : queries) {
137+
int l = qq[0], r = qq[1], k = qq[2], v = qq[3];
138+
if (k > B) {
139+
for (int idx = l; idx <= r; idx += k) {
140+
nums[idx] = (long long) nums[idx] * v % MOD;
141+
}
142+
} else {
143+
int res = l % k;
144+
int t1 = (l - res) / k;
145+
int t2 = (r - res) / k;
146+
events[k][res].push_back({t1, v});
147+
148+
if (t2 + 1 <= (n - 1 - res) / k) {
149+
int invv = modpow(v, MOD - 2);
150+
events[k][res].push_back({t2 + 1, invv});
151+
}
152+
}
153+
}
154+
155+
for (int k = 1; k <= B; ++k) {
156+
for (int res = 0; res < k; ++res) {
157+
auto& ev = events[k][res];
158+
if (ev.empty()) {
159+
continue;
160+
}
161+
162+
sort(ev.begin(), ev.end());
163+
vector<pair<int, int>> comp;
164+
165+
for (auto& p : ev) {
166+
if (!comp.empty() && comp.back().first == p.first) {
167+
comp.back().second = (long long) comp.back().second * p.second % MOD;
168+
} else {
169+
comp.push_back(p);
170+
}
171+
}
172+
173+
long long cur = 1;
174+
int ptr = 0;
175+
int t = 0;
176+
for (int idx = res; idx < n; idx += k, ++t) {
177+
while (ptr < comp.size() && comp[ptr].first == t) {
178+
cur = (cur * comp[ptr].second) % MOD;
179+
++ptr;
180+
}
181+
nums[idx] = nums[idx] * cur % MOD;
182+
}
183+
}
184+
}
185+
186+
int xr = 0;
187+
for (int x : nums) {
188+
xr ^= x;
189+
}
190+
191+
return xr;
192+
}
193+
};
113194
```
114195
115196
#### Go

solution/3600-3699/3655.XOR After Range Multiplication Queries II/README_EN.md

Lines changed: 82 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,88 @@ tags:
107107
#### C++
108108

109109
```cpp
110-
110+
class Solution {
111+
static constexpr int MOD = 1000000007;
112+
113+
long long modpow(long long a, long long e) {
114+
long long r = 1 % MOD;
115+
a %= MOD;
116+
while (e > 0) {
117+
if (e & 1) { r = (r * a) % MOD; }
118+
a = (a * a) % MOD;
119+
e >>= 1;
120+
}
121+
return r;
122+
}
123+
124+
public:
125+
int xorAfterQueries(vector<int>& nums, vector<vector<int>>& queries) {
126+
int n = nums.size();
127+
int B = sqrt(n) + 1;
128+
129+
vector<vector<vector<pair<int, int>>>> events(B + 1);
130+
for (int k = 1; k <= B; ++k) {
131+
events[k].resize(k);
132+
}
133+
134+
for (auto& qq : queries) {
135+
int l = qq[0], r = qq[1], k = qq[2], v = qq[3];
136+
if (k > B) {
137+
for (int idx = l; idx <= r; idx += k) {
138+
nums[idx] = (long long) nums[idx] * v % MOD;
139+
}
140+
} else {
141+
int res = l % k;
142+
int t1 = (l - res) / k;
143+
int t2 = (r - res) / k;
144+
events[k][res].push_back({t1, v});
145+
146+
if (t2 + 1 <= (n - 1 - res) / k) {
147+
int invv = modpow(v, MOD - 2);
148+
events[k][res].push_back({t2 + 1, invv});
149+
}
150+
}
151+
}
152+
153+
for (int k = 1; k <= B; ++k) {
154+
for (int res = 0; res < k; ++res) {
155+
auto& ev = events[k][res];
156+
if (ev.empty()) {
157+
continue;
158+
}
159+
160+
sort(ev.begin(), ev.end());
161+
vector<pair<int, int>> comp;
162+
163+
for (auto& p : ev) {
164+
if (!comp.empty() && comp.back().first == p.first) {
165+
comp.back().second = (long long) comp.back().second * p.second % MOD;
166+
} else {
167+
comp.push_back(p);
168+
}
169+
}
170+
171+
long long cur = 1;
172+
int ptr = 0;
173+
int t = 0;
174+
for (int idx = res; idx < n; idx += k, ++t) {
175+
while (ptr < comp.size() && comp[ptr].first == t) {
176+
cur = (cur * comp[ptr].second) % MOD;
177+
++ptr;
178+
}
179+
nums[idx] = nums[idx] * cur % MOD;
180+
}
181+
}
182+
}
183+
184+
int xr = 0;
185+
for (int x : nums) {
186+
xr ^= x;
187+
}
188+
189+
return xr;
190+
}
191+
};
111192
```
112193
113194
#### Go
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
class Solution {
2+
static constexpr int MOD = 1000000007;
3+
4+
long long modpow(long long a, long long e) {
5+
long long r = 1 % MOD;
6+
a %= MOD;
7+
while (e > 0) {
8+
if (e & 1) { r = (r * a) % MOD; }
9+
a = (a * a) % MOD;
10+
e >>= 1;
11+
}
12+
return r;
13+
}
14+
15+
public:
16+
int xorAfterQueries(vector<int>& nums, vector<vector<int>>& queries) {
17+
int n = nums.size();
18+
int B = sqrt(n) + 1;
19+
20+
vector<vector<vector<pair<int, int>>>> events(B + 1);
21+
for (int k = 1; k <= B; ++k) {
22+
events[k].resize(k);
23+
}
24+
25+
for (auto& qq : queries) {
26+
int l = qq[0], r = qq[1], k = qq[2], v = qq[3];
27+
if (k > B) {
28+
for (int idx = l; idx <= r; idx += k) {
29+
nums[idx] = (long long) nums[idx] * v % MOD;
30+
}
31+
} else {
32+
int res = l % k;
33+
int t1 = (l - res) / k;
34+
int t2 = (r - res) / k;
35+
events[k][res].push_back({t1, v});
36+
37+
if (t2 + 1 <= (n - 1 - res) / k) {
38+
int invv = modpow(v, MOD - 2);
39+
events[k][res].push_back({t2 + 1, invv});
40+
}
41+
}
42+
}
43+
44+
for (int k = 1; k <= B; ++k) {
45+
for (int res = 0; res < k; ++res) {
46+
auto& ev = events[k][res];
47+
if (ev.empty()) {
48+
continue;
49+
}
50+
51+
sort(ev.begin(), ev.end());
52+
vector<pair<int, int>> comp;
53+
54+
for (auto& p : ev) {
55+
if (!comp.empty() && comp.back().first == p.first) {
56+
comp.back().second = (long long) comp.back().second * p.second % MOD;
57+
} else {
58+
comp.push_back(p);
59+
}
60+
}
61+
62+
long long cur = 1;
63+
int ptr = 0;
64+
int t = 0;
65+
for (int idx = res; idx < n; idx += k, ++t) {
66+
while (ptr < comp.size() && comp[ptr].first == t) {
67+
cur = (cur * comp[ptr].second) % MOD;
68+
++ptr;
69+
}
70+
nums[idx] = nums[idx] * cur % MOD;
71+
}
72+
}
73+
}
74+
75+
int xr = 0;
76+
for (int x : nums) {
77+
xr ^= x;
78+
}
79+
80+
return xr;
81+
}
82+
};

0 commit comments

Comments
 (0)