Skip to content

Commit a32314d

Browse files
committed
Stuff
1 parent 56906f5 commit a32314d

File tree

15 files changed

+596
-0
lines changed

15 files changed

+596
-0
lines changed

CSES/(3) Dynamic Programming/1653.cpp

+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
#include <bits/stdc++.h>
2+
typedef long long ll;
3+
using namespace std;
4+
5+
ll w[20];
6+
pair<int, ll> dp[1 << 20];
7+
8+
int main() {
9+
cin.tie(0)->sync_with_stdio(0);
10+
int n;
11+
ll x;
12+
cin >> n >> x;
13+
for (int i = 0; i < n; i++) cin >> w[i];
14+
dp[0] = {1, 0};
15+
for (int mask = 1; mask < (1 << n); mask++) {
16+
dp[mask] = {INT_MAX, 0};
17+
for (int i = 0; i < n; i++) if (mask & (1 << i)) {
18+
int sm = dp[mask ^ (1 << i)].second + w[i];
19+
if (sm <= x)
20+
dp[mask] = min(dp[mask], {dp[mask ^ (1 << i)].first, sm});
21+
else
22+
dp[mask] = min(dp[mask], {dp[mask ^ (1 << i)].first + 1, w[i]});
23+
}
24+
}
25+
cout << dp[(1 << n) - 1].first;
26+
return 0;
27+
}

CSES/(3) Dynamic Programming/2413.cpp

Whitespace-only changes.

CSES/(4) Graph Algorithms/1684.cpp

+51
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
#include <bits/stdc++.h>
2+
typedef long long ll;
3+
using namespace std;
4+
5+
vector<int> graph[200001], rev[200001];
6+
bool visited[200001];
7+
stack<int> stck;
8+
int scc = 0, cmp[200001];
9+
char ans[100001];
10+
11+
void dfs1(int node) {
12+
visited[node] = true;
13+
for (int i : graph[node]) if (!visited[i]) dfs1(i);
14+
stck.push(node);
15+
}
16+
17+
void dfs2(int node) {
18+
cmp[node] = scc;
19+
for (int i : rev[node]) if (!cmp[i]) dfs2(i);
20+
}
21+
22+
int main() {
23+
cin.tie(0)->sync_with_stdio(0);
24+
int n, m;
25+
cin >> n >> m;
26+
while (n--) {
27+
char c1, c2;
28+
int t1, t2;
29+
cin >> c1 >> t1 >> c2 >> t2;
30+
graph[t1 * 2 - (c1 == '+')].push_back(t2 * 2 - (c2 == '-'));
31+
graph[t2 * 2 - (c2 == '+')].push_back(t1 * 2 - (c1 == '-'));
32+
}
33+
for (int i = 1; i <= 2 * m; i++) if (!visited[i])
34+
dfs1(i);
35+
for (int i = 1; i <= 2 * m; i++) for (int j : graph[i])
36+
rev[j].push_back(i);
37+
while (stck.size()) {
38+
int curr = stck.top();
39+
stck.pop();
40+
if (!cmp[curr]) {
41+
scc++;
42+
dfs2(curr);
43+
}
44+
}
45+
for (int i = 1; i <= m; i++) {
46+
if (cmp[2 * i - 1] == cmp[2 * i]) return cout << "IMPOSSIBLE", 0;
47+
ans[i] = (cmp[2 * i - 1] < cmp[2 * i] ? '+' : '-');
48+
}
49+
for (int i = 1; i <= m; i++) cout << ans[i] << ' ';
50+
return 0;
51+
}

CSES/(4) Graph Algorithms/1690.cpp

+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
#include <bits/stdc++.h>
2+
typedef long long ll;
3+
using namespace std;
4+
5+
const int MOD = 1e9 + 7;
6+
7+
vector<int> graph[20];
8+
int dp[1 << 20][20];
9+
10+
int main() {
11+
cin.tie(0)->sync_with_stdio(0);
12+
int n, m;
13+
cin >> n >> m;
14+
while (m--) {
15+
int u, v;
16+
cin >> u >> v;
17+
graph[u - 1].push_back(v - 1);
18+
}
19+
dp[1][0] = 1;
20+
for (int mask = 1; mask < (1 << n); mask++)
21+
for (int i = 0; i < n; i++) if (mask & (1 << i)) {
22+
for (int j : graph[i]) {
23+
dp[mask ^ (1 << j)][j] += dp[mask][i];
24+
if (dp[mask ^ (1 << j)][j] >= MOD) dp[mask ^ (1 << j)][j] -= MOD;
25+
}
26+
}
27+
cout << dp[(1 << n) - 1][n - 1];
28+
return 0;
29+
}

CSES/(4) Graph Algorithms/1691.cpp

+64
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
#include <bits/stdc++.h>
2+
typedef long long ll;
3+
using namespace std;
4+
5+
vector<pair<int, int>> graph[100001];
6+
int nxt[100001], cmp[100001];
7+
bool visited[100001], used[200001], processed[100001];
8+
vector<vector<int>> cycles_on[100001];
9+
10+
int find(int A) { return cmp[A] = (A == cmp[A] ? A : find(cmp[A])); }
11+
void onion(int A, int B) { cmp[find(A)] = find(B); }
12+
13+
void dfs(int node = 1) {
14+
if (visited[node]) {
15+
int start = node;
16+
cycles_on[start].push_back({});
17+
while (visited[node]) {
18+
visited[node] = false;
19+
cycles_on[start].back().push_back(node);
20+
node = nxt[node];
21+
}
22+
}
23+
while (graph[node].size()) {
24+
int c, idx;
25+
tie(c, idx) = graph[node].back();
26+
graph[node].pop_back();
27+
if (!used[idx]) {
28+
used[idx] = true;
29+
visited[node] = true;
30+
nxt[node] = c;
31+
dfs(c);
32+
}
33+
}
34+
}
35+
36+
void process(int node) {
37+
if (!processed[node]) {
38+
processed[node] = true;
39+
for (auto &i : cycles_on[node]) {
40+
for (int j : i) process(j);
41+
}
42+
}
43+
cout << node << ' ';
44+
}
45+
46+
int main() {
47+
cin.tie(0)->sync_with_stdio(0);
48+
int n, m;
49+
cin >> n >> m;
50+
iota(cmp + 1, cmp + n + 1, 1);
51+
while (m--) {
52+
int u, v;
53+
cin >> u >> v;
54+
graph[u].push_back({v, m});
55+
graph[v].push_back({u, m});
56+
onion(u, v);
57+
}
58+
for (int i = 1; i <= n; i++)
59+
if ((graph[i].size() & 1) || (graph[i].size() && find(i) != find(1)))
60+
return cout << "IMPOSSIBLE", 0;
61+
dfs();
62+
process(1);
63+
return 0;
64+
}

CSES/(5) Range Queries/1734.cpp

+44
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
#include <bits/stdc++.h>
2+
typedef long long ll;
3+
using namespace std;
4+
5+
int n, q, a[200001], bit[200001], res[200001];
6+
tuple<int, int, int> queries[200001];
7+
map<int, int> has;
8+
9+
void update(int pos, int val) {
10+
for (; pos <= n; pos += pos & -pos) bit[pos] += val;
11+
}
12+
13+
int query(int l, int r) {
14+
int ans = 0;
15+
for (; r; r -= r & -r) ans += bit[r];
16+
for (l--; l; l -= l & -l) ans -= bit[l];
17+
return ans;
18+
}
19+
20+
int main() {
21+
cin.tie(0)->sync_with_stdio(0);
22+
cin >> n >> q;
23+
for (int i = 1; i <= n; i++) cin >> a[i];
24+
for (int i = 1; i <= q; i++) {
25+
int l, r;
26+
cin >> l >> r;
27+
queries[i] = {r, l, i};
28+
}
29+
sort(queries + 1, queries + q + 1);
30+
int rptr = 1;
31+
for (int i = 1; i <= q; i++) {
32+
int r, l, idx;
33+
tie(r, l, idx) = queries[i];
34+
while (rptr <= r) {
35+
if (has.count(a[rptr])) update(has[a[rptr]], -1);
36+
update(rptr, 1);
37+
has[a[rptr]] = rptr;
38+
rptr++;
39+
}
40+
res[idx] = query(l, r);
41+
}
42+
for (int i = 1; i <= q; i++) cout << res[i] << '\n';
43+
return 0;
44+
}

CSES/(5) Range Queries/2166.cpp

+59
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
#include <bits/stdc++.h>
2+
typedef long long ll;
3+
using namespace std;
4+
5+
const ll INF = 1e18;
6+
7+
int n, q;
8+
ll a[200001];
9+
pair<ll, ll> segtree[800001];
10+
11+
void build(int node = 1, int l = 1, int r = n) {
12+
if (l == r) segtree[node] = {max(0ll, a[l]), a[l]};
13+
else {
14+
int mid = (l + r) / 2;
15+
build(node * 2, l, mid);
16+
build(node * 2 + 1, mid + 1, r);
17+
segtree[node].first = max(segtree[node * 2].first, segtree[node * 2].second + segtree[node * 2 + 1].first);
18+
segtree[node].second = segtree[node * 2].second + segtree[node * 2 + 1].second;
19+
}
20+
}
21+
22+
void update(int pos, ll val, int node = 1, int l = 1, int r = n) {
23+
if (l == r) segtree[node] = {max(0ll, val), val};
24+
else {
25+
int mid = (l + r) / 2;
26+
if (pos > mid) update(pos, val, node * 2 + 1, mid + 1, r);
27+
else update(pos, val, node * 2, l, mid);
28+
segtree[node].first = max(segtree[node * 2].first, segtree[node * 2].second + segtree[node * 2 + 1].first);
29+
segtree[node].second = segtree[node * 2].second + segtree[node * 2 + 1].second;
30+
}
31+
}
32+
33+
ll query(int x, int y, int node = 1, int l = 1, int r = n) {
34+
if (l > y || r < x) return -INF;
35+
if (l >= x && r <= y) return segtree[node].first;
36+
int mid = (l + r) / 2;
37+
return max(query(x, y, node * 2, l, mid), segtree[node * 2].second + query(x, y, node * 2 + 1, mid + 1, r));
38+
}
39+
40+
ll pref(int x, int node = 1, int l = 1, int r = n) {
41+
if (l > x) return 0;
42+
if (r <= x) return segtree[node].second;
43+
int mid = (l + r) / 2;
44+
return pref(x, node * 2, l, mid) + pref(x, node * 2 + 1, mid + 1, r);
45+
}
46+
47+
int main() {
48+
cin.tie(0)->sync_with_stdio(0);
49+
cin >> n >> q;
50+
for (int i = 1; i <= n; i++) cin >> a[i];
51+
build();
52+
while (q--) {
53+
int t, k, u;
54+
cin >> t >> k >> u;
55+
if (t == 1) update(k, u);
56+
else cout << query(k, u) - pref(k - 1) << '\n';
57+
}
58+
return 0;
59+
}

CSES/(5) Range Queries/2206.cpp

+61
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
#include <bits/stdc++.h>
2+
typedef long long ll;
3+
using namespace std;
4+
5+
const int INF = 1e9;
6+
7+
int n, q, a[200001], segtree[800001][2];
8+
9+
void build(int node = 1, int l = 1, int r = n) {
10+
if (l == r) {
11+
segtree[node][0] = a[l] - l;
12+
segtree[node][1] = a[l] + l;
13+
} else {
14+
int mid = (l + r) / 2;
15+
build(node * 2, l, mid);
16+
build(node * 2 + 1, mid + 1, r);
17+
segtree[node][0] = min(segtree[node * 2][0], segtree[node * 2 + 1][0]);
18+
segtree[node][1] = min(segtree[node * 2][1], segtree[node * 2 + 1][1]);
19+
}
20+
}
21+
22+
void update(int pos, int val, int node = 1, int l = 1, int r = n) {
23+
if (l == r) {
24+
segtree[node][0] = val - l;
25+
segtree[node][1] = val + l;
26+
} else {
27+
int mid = (l + r) / 2;
28+
if (pos > mid) update(pos, val, node * 2 + 1, mid + 1, r);
29+
else update(pos, val, node * 2, l, mid);
30+
segtree[node][0] = min(segtree[node * 2][0], segtree[node * 2 + 1][0]);
31+
segtree[node][1] = min(segtree[node * 2][1], segtree[node * 2 + 1][1]);
32+
}
33+
}
34+
35+
int query(int x, int y, int t, int node = 1, int l = 1, int r = n) {
36+
if (l > y || r < x) return INF;
37+
if (l >= x && r <= y) return segtree[node][t];
38+
int mid = (l + r) / 2;
39+
return min(query(x, y, t, node * 2, l, mid), query(x, y, t, node * 2 + 1, mid + 1, r));
40+
}
41+
42+
int main() {
43+
cin.tie(0)->sync_with_stdio(0);
44+
cin >> n >> q;
45+
for (int i = 1; i <= n; i++) cin >> a[i];
46+
build();
47+
while (q--) {
48+
int t;
49+
cin >> t;
50+
if (t == 1) {
51+
int k, x;
52+
cin >> k >> x;
53+
update(k, x);
54+
} else {
55+
int k;
56+
cin >> k;
57+
cout << min(query(1, k, 0) + k, query(k, n, 1) - k) << '\n';
58+
}
59+
}
60+
return 0;
61+
}

0 commit comments

Comments
 (0)