Skip to content

Commit d4cf22e

Browse files
committed
new: IEEEXtreme 15 & 18
1 parent 2676684 commit d4cf22e

17 files changed

+643
-0
lines changed
File renamed without changes.
File renamed without changes.

solutions/IEEEXtreme/IEEEXtreme 18/Bounded tuples.cpp

Whitespace-only changes.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
#include <bits/stdc++.h>
2+
using namespace std;
3+
typedef long long ll;
4+
5+
const int N = 1e6 + 3;
6+
ll nextu[N];
7+
ll vis[N];
8+
9+
void dfs(int n, vector<ll>& v) {
10+
if (vis[n]) return;
11+
vis[n] = 1;
12+
v.push_back(n);
13+
dfs(nextu[n], v);
14+
}
15+
16+
void solve() {
17+
ll n, x;
18+
cin >> n >> x;
19+
ll a[n];
20+
21+
for (int i = 0; i < n; i++) cin >> a[i];
22+
sort(a, a + n, greater<ll>());
23+
24+
ll start = 0, mini = 0, end = 0;
25+
26+
while (end < n - 1) {
27+
// cout << start << " " << end << endl;
28+
if ((a[end + 1] + x) <= a[start]) {
29+
nextu[start] = end + 1;
30+
start++;
31+
end++;
32+
} else {
33+
end++;
34+
}
35+
}
36+
// for (int i = 0; i < n; i++) cout << nextu[i] << " ";
37+
vector<vector<ll>> aa;
38+
for (int i = 0; i < n; i++) {
39+
vector<ll> v;
40+
dfs(i, v);
41+
if (v.size() > 0) {
42+
aa.push_back(v);
43+
}
44+
}
45+
cout << aa.size() << endl;
46+
for (auto& y : aa) {
47+
cout << y.size() << " ";
48+
for (int i : y) {
49+
cout << a[i] << " ";
50+
}
51+
cout << endl;
52+
}
53+
}
54+
55+
int main() {
56+
ios::sync_with_stdio(false);
57+
cin.tie(0);
58+
59+
int t = 1;
60+
// cin >> t;
61+
while (t--) {
62+
solve();
63+
}
64+
65+
return 0;
66+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
#include <bits/stdc++.h>
2+
#pragma GCC optimization ("O2")
3+
using namespace std;
4+
typedef long long ll;
5+
const ll mod = 1e9 + 7;
6+
7+
struct Hashing {
8+
vector<vector<ll>> p, pref;
9+
// assuming s is only composed of a-z characters
10+
Hashing(const string &s) {
11+
int n = s.length();
12+
// change if s contains other chars than a-z
13+
// primes should be greater than number of possible characters
14+
vector primes{31, 37};
15+
p.assign(primes.size(), vector<ll>(n + 1));
16+
pref.assign(primes.size(), vector<ll>(n + 1));
17+
for (int i = 0; i < primes.size(); i++) p[i][0] = 1, p[i][1] = primes[i];
18+
for (int i = 0; i < p.size(); i++) {
19+
p[i].resize(n + 1);
20+
for (int j = 0; j < n; j++) {
21+
// change here if s contains other chars than a-z
22+
int c = s[j] - 'a' + 1;
23+
pref[i][j + 1] = (pref[i][j] + c * p[i][j]) % mod;
24+
p[i][j + 1] = p[i][j] * p[i][1] % mod;
25+
}
26+
}
27+
}
28+
// hash of s[l..r] inclusive for l & r
29+
vector<ll> get(int l, int r) {
30+
int n = p[0].size() - 1;
31+
vector<ll> ans(p.size());
32+
for (int i = 0; i < p.size(); i++) {
33+
ans[i] = (pref[i][r + 1] - pref[i][l] + mod) % mod;
34+
ans[i] = ans[i] * p[i][n - l] % mod;
35+
}
36+
return ans;
37+
}
38+
bool compare(pair<int, int> r1, pair<int, int> r2) {
39+
auto res1 = get(r1.first, r1.second);
40+
auto res2 = get(r2.first, r2.second);
41+
for (int i = 0; i < p.size(); i++)
42+
if (res1[i] != res2[i]) return false;
43+
return true;
44+
}
45+
};
46+
47+
int main() {
48+
string s;
49+
cin >> s;
50+
int n = s.length();
51+
auto h = Hashing(s);
52+
unordered_map<ll, vector<pair<int, int>>> a;
53+
unordered_map<ll, int> sz;
54+
for (int r = 0; r < n; r++) {
55+
for (int l = 0; l <= r; l++) {
56+
auto tmp = h.get(l, r);
57+
ll hash = tmp[0] + mod * tmp[1];
58+
sz[hash] = r - l + 1;
59+
a[hash].push_back({l, r});
60+
}
61+
}
62+
63+
auto getNbComponents = [&](vector<pair<int, int>> &a) {
64+
sort(a.begin(), a.end());
65+
int curl = 0, curr = 0, ans = 1;
66+
for (auto [l, r] : a) {
67+
if (l > curr) {
68+
ans += l - curr;
69+
curl = l, curr = r;
70+
} else {
71+
curr = max(curr, r);
72+
}
73+
}
74+
ans += (n - 1) - curr;
75+
return ans;
76+
};
77+
78+
vector<vector<int>> v(n + 1);
79+
for (auto [hash, ranges] : a) {
80+
v[sz[hash]].push_back(getNbComponents(ranges));
81+
}
82+
83+
vector<int> ans(n + 1, 0);
84+
for (int len = n; len >= 0; len--) {
85+
for (auto nb : v[len]) {
86+
ans[nb] = len;
87+
}
88+
}
89+
90+
for (int i = 1; i <= n; i++) cout << ans[i] << " ";
91+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,182 @@
1+
#include <bits/stdc++.h>
2+
using namespace std;
3+
typedef long long ll;
4+
5+
pair<ll, int> operator+(const pair<ll, int> &a, const pair<ll, int> &b) {
6+
return {a.first + b.first, a.second + b.second};
7+
}
8+
9+
int n, q;
10+
11+
struct SegTree {
12+
vector<ll> t, maxT, minT, lazyAdd, lazyReplace;
13+
vector<bool> marked;
14+
vector<int> happ, lazyHapp;
15+
SegTree(vector<int> &a) {
16+
marked.assign(4 * n, false);
17+
lazyAdd.assign(4 * n, 0);
18+
lazyReplace.assign(4 * n, 0);
19+
happ.assign(4 * n, 0);
20+
lazyHapp.assign(4 * n, 0);
21+
t.resize(4 * n);
22+
maxT.resize(4 * n);
23+
minT.resize(4 * n);
24+
build(a);
25+
}
26+
void build(vector<int> &a, int v = 1, int l = 0, int r = n - 1) {
27+
if (l == r) {
28+
t[v] = a[l];
29+
maxT[v] = t[v];
30+
minT[v] = t[v];
31+
} else {
32+
int m = (l + r) / 2;
33+
build(a, 2 * v, l, m);
34+
build(a, 2 * v + 1, m + 1, r);
35+
t[v] = t[2 * v] + t[2 * v + 1];
36+
maxT[v] = max(maxT[2 * v], maxT[2 * v + 1]);
37+
minT[v] = max(minT[2 * v], minT[2 * v + 1]);
38+
}
39+
}
40+
void compose(int p, int c) {
41+
if (marked[p]) {
42+
lazyAdd[c] = lazyAdd[p];
43+
lazyReplace[c] = lazyAdd[p];
44+
marked[c] = true;
45+
} else {
46+
lazyAdd[c] += lazyAdd[p];
47+
}
48+
49+
lazyHapp[c] += lazyHapp[p];
50+
}
51+
void push(int v, int l, int r) {
52+
int m = (l + r) / 2;
53+
if (marked[v]) {
54+
t[v] = (r - l + 1) * lazyReplace[v];
55+
maxT[v] = minT[v] = lazyReplace[v];
56+
}
57+
58+
t[v] += (r - l + 1) * lazyAdd[v];
59+
maxT[v] = max(maxT[v], maxT[v] + lazyAdd[v]);
60+
minT[v] = max(minT[v], minT[v] + lazyAdd[v]);
61+
happ[v] += (r - l + 1) * lazyHapp[v];
62+
63+
if (l != r) {
64+
compose(v, 2 * v);
65+
compose(v, 2 * v + 1);
66+
}
67+
68+
marked[v] = false;
69+
lazyAdd[v] = 0;
70+
lazyHapp[v] = 0;
71+
}
72+
void add(int a, int b, int c, int v = 1, int l = 0, int r = n - 1) {
73+
if (a > b || a > r || b < l) return;
74+
if (a == l && b == r) {
75+
lazyAdd[v] += c;
76+
if (c > 0)
77+
lazyHapp[v]++;
78+
else
79+
lazyHapp[v]--;
80+
return;
81+
}
82+
push(v, l, r);
83+
int m = (l + r) / 2;
84+
add(a, min(b, m), c, 2 * v, l, m);
85+
add(max(a, m + 1), b, c, 2 * v + 1, m + 1, r);
86+
push(2 * v, l, m);
87+
push(2 * v + 1, m + 1, r);
88+
t[v] = t[2 * v] + t[2 * v + 1];
89+
maxT[v] = max(maxT[2 * v], maxT[2 * v + 1]);
90+
minT[v] = max(minT[2 * v], minT[2 * v + 1]);
91+
happ[v] = happ[2 * v] + happ[2 * v + 1];
92+
}
93+
void replace(int a, int b, int c, int v = 1, int l = 0, int r = n - 1) {
94+
if (a > b || a > r || b < l) return;
95+
if (a == l && b == r &&
96+
(c > maxT[v] + lazyAdd[v] || c < minT[v] + lazyAdd[v] || l == r)) {
97+
if (c > maxT[v] + lazyAdd[v])
98+
lazyHapp[v]++;
99+
else if (c < minT[v] + lazyAdd[v])
100+
lazyHapp[v]--;
101+
else
102+
lazyHapp[v] += c > t[v] + lazyAdd[v] ? 1 : -1;
103+
lazyReplace[v] = c;
104+
lazyAdd[v] = 0;
105+
marked[v] = true;
106+
return;
107+
}
108+
push(v, l, r);
109+
int m = (l + r) / 2;
110+
replace(a, min(b, m), c, 2 * v, l, m);
111+
replace(max(a, m + 1), b, c, 2 * v + 1, m + 1, r);
112+
push(2 * v, l, m);
113+
push(2 * v + 1, m + 1, r);
114+
t[v] = t[2 * v] + t[2 * v + 1];
115+
maxT[v] = max(maxT[2 * v], maxT[2 * v + 1]);
116+
minT[v] = max(minT[2 * v], minT[2 * v + 1]);
117+
happ[v] = happ[2 * v] + happ[2 * v + 1];
118+
}
119+
pair<ll, int> query(int a, int b, int v = 1, int l = 0, int r = n - 1) {
120+
if (a > b || a > r || b < l) return make_pair(0LL, 0);
121+
push(v, l, r);
122+
if (a == l && b == r) return make_pair(t[v], happ[v]);
123+
int m = (l + r) / 2;
124+
auto ql = query(a, min(b, m), 2 * v, l, m);
125+
auto qr = query(max(a, m + 1), b, 2 * v + 1, m + 1, r);
126+
return ql + qr;
127+
}
128+
void print() {
129+
queue<tuple<int, int, int>> q, tmp;
130+
q.push({1, 0, n - 1});
131+
while (!q.empty()) {
132+
while (!q.empty()) {
133+
auto [v, l, r] = q.front();
134+
cout << "(" << t[v] << "," << lazyAdd[v] << "," << lazyReplace[v]
135+
<< "," << happ[v] << "," << lazyHapp[v] << ") ";
136+
q.pop();
137+
138+
if (l < r) {
139+
int m = (l + r) / 2;
140+
tmp.push({2 * v, l, m});
141+
tmp.push({2 * v + 1, m + 1, r});
142+
}
143+
}
144+
cout << "\n";
145+
q.swap(tmp);
146+
}
147+
cout << "\n\n";
148+
}
149+
};
150+
151+
int main() {
152+
ios::sync_with_stdio(false);
153+
cin.tie(0);
154+
cout.tie(0);
155+
156+
cin >> n >> q;
157+
vector<int> a(n);
158+
for (auto &i : a) cin >> i;
159+
SegTree st(a);
160+
161+
while (q--) {
162+
int type, l, r, c;
163+
cin >> type;
164+
if (type <= 1) {
165+
cin >> l >> r >> c;
166+
l--, r--;
167+
if (type == 0)
168+
st.replace(l, r, c);
169+
else
170+
st.add(l, r, c);
171+
} else {
172+
cin >> l >> r;
173+
l--, r--;
174+
auto [sal, hap] = st.query(l, r);
175+
ll ans = type == 2 ? sal : hap;
176+
ll len = r - l + 1;
177+
auto g = gcd(abs(ans), len);
178+
cout << ans / g << "/" << len / g << "\n";
179+
}
180+
// st.print();
181+
}
182+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
#include <bits/stdc++.h>
2+
using namespace std;
3+
typedef long long ll;
4+
5+
void solve() {
6+
string s;
7+
cin >> s;
8+
ll count = 0, maxi = 0, mini = 0;
9+
ll n = s.size();
10+
ll b, a = 0;
11+
for (int i = 0; i < n; i++) {
12+
if (s[i] == 'U')
13+
count++;
14+
else if (s[i] == 'L')
15+
count--;
16+
maxi = max(maxi, count);
17+
mini = min(mini, count);
18+
}
19+
if (count > 0) {
20+
b = mini - 1;
21+
mini--;
22+
} else {
23+
b = maxi + 1;
24+
maxi++;
25+
}
26+
if (b == maxi)
27+
b = 1;
28+
else
29+
b = maxi - mini + 1;
30+
cout << maxi - mini + 1 << " " << maxi + 1 << " " << b << endl;
31+
for (int i = 1; i < maxi - mini + 1; i++) {
32+
cout << i + 1 << " " << 0 << endl;
33+
}
34+
cout << "0 0" << endl;
35+
}
36+
37+
int main() {
38+
ios::sync_with_stdio(false);
39+
cin.tie(0);
40+
41+
int t = 1;
42+
// cin >> t;
43+
while (t--) {
44+
solve();
45+
}
46+
}

0 commit comments

Comments
 (0)