Skip to content

Commit ae489d0

Browse files
committed
Random stuff
1 parent 64ce1da commit ae489d0

13 files changed

+860
-0
lines changed

COI/COI 17-ili.cpp

+80
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
#include <bits/stdc++.h>
2+
typedef long long ll;
3+
using namespace std;
4+
5+
int known[20001];
6+
bool val[20001];
7+
vector<int> bck[20001], fwd[20001];
8+
9+
int main() {
10+
cin.tie(0)->sync_with_stdio(0);
11+
int n, m;
12+
cin >> n >> m;
13+
deque<int> dq;
14+
for (int i = 1; i <= m; i++) {
15+
char c;
16+
cin >> c;
17+
if (c == '0') {
18+
known[i] = 2;
19+
val[i] = 0;
20+
dq.push_front(i);
21+
} else if (c == '1') {
22+
known[i] = 2;
23+
val[i] = 1;
24+
dq.push_back(i);
25+
}
26+
}
27+
for (int i = 1; i <= m; i++) {
28+
char c1, c2;
29+
int u1, u2;
30+
cin >> c1 >> u1 >> c2 >> u2;
31+
if (c1 == 'x') u1 += m;
32+
if (c2 == 'x') u2 += m;
33+
bck[i].push_back(u1);
34+
bck[i].push_back(u2);
35+
fwd[u1].push_back(i);
36+
fwd[u2].push_back(i);
37+
}
38+
while (dq.size()) {
39+
int curr = dq.front();
40+
cout << curr << ' ' << val[curr] << endl;
41+
dq.pop_front();
42+
if (val[curr]) {
43+
for (int i : fwd[curr]) if (known[i] != 2) {
44+
known[i] = 2;
45+
val[i] = 1;
46+
dq.push_back(i);
47+
}
48+
if (curr <= m) {
49+
if (known[bck[curr][0]] == 2 && known[bck[curr][1]] != 2 && !val[bck[curr][0]]) {
50+
known[bck[curr][1]] = 2;
51+
val[bck[curr][1]] = 1;
52+
dq.push_back(bck[curr][1]);
53+
}
54+
if (known[bck[curr][1]] == 2 && known[bck[curr][0]] != 2 && !val[bck[curr][1]]) {
55+
known[bck[curr][0]] = 2;
56+
val[bck[curr][0]] = 1;
57+
dq.push_back(bck[curr][0]);
58+
}
59+
}
60+
} else {
61+
for (int i : bck[curr]) if (known[i] != 2) {
62+
known[i] = 2;
63+
val[i] = 0;
64+
dq.push_front(i);
65+
}
66+
for (int i : fwd[curr]) if (known[i] != 2) {
67+
known[i]++;
68+
if (known[i] == 2) {
69+
if (val[i]) dq.push_back(i);
70+
else dq.push_front(i);
71+
}
72+
}
73+
}
74+
}
75+
for (int i = 1; i <= m; i++) {
76+
if (known[i] == 2) cout << val[i];
77+
else cout << '?';
78+
}
79+
return 0;
80+
}

COI/COI 21-cigle.cpp

+39
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
#include <bits/stdc++.h>
2+
typedef long long ll;
3+
using namespace std;
4+
5+
int a[5001], pref[5001], dp[5001][5001];
6+
bool visited[5001][5001];
7+
8+
void compute(int l, int r) {
9+
if (visited[l][r]) return;
10+
visited[l][r] = true;
11+
12+
int cnt = 0, curr_sm = 0;
13+
for (int i = l - 1, j = l; i; i--) {
14+
while (pref[l - 1] - pref[i - 1] > curr_sm && j <= r)
15+
curr_sm += a[j++];
16+
compute(i, l - 1);
17+
dp[l][r] = max(dp[l][r], dp[i][l - 1] + cnt);
18+
if (pref[l - 1] - pref[i - 1] == curr_sm && j <= r) cnt++;
19+
}
20+
}
21+
22+
int main() {
23+
cin.tie(0)->sync_with_stdio(0);
24+
int n;
25+
cin >> n;
26+
for (int i = 1; i <= n; i++) {
27+
cin >> a[i];
28+
pref[i] = a[i] + pref[i - 1];
29+
}
30+
31+
for (int i = 1; i <= n; i++) visited[1][i] = true;
32+
int ans = 0;
33+
for (int i = 1; i <= n; i++) {
34+
compute(i, n);
35+
ans = max(ans, dp[i][n]);
36+
}
37+
cout << ans;
38+
return 0;
39+
}

COI/COI 21-izvanzemaljci.cpp

+130
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
#include <bits/stdc++.h>
2+
typedef long long ll;
3+
using namespace std;
4+
5+
const ll INF = 3e9 - 4;
6+
7+
struct Point {
8+
ll x, y;
9+
} points[100001];
10+
11+
struct Square {
12+
Point p;
13+
ll l;
14+
};
15+
16+
int n, k;
17+
18+
pair<ll, vector<Square>> one() {
19+
// Bounding box
20+
ll mn_x = INT_MAX, mn_y = INT_MAX;
21+
ll mx_x = INT_MIN, mx_y = INT_MIN;
22+
for (int i = 1; i <= n; i++) {
23+
mn_x = min(mn_x, points[i].x);
24+
mx_x = max(mx_x, points[i].x);
25+
mn_y = min(mn_y, points[i].y);
26+
mx_y = max(mx_y, points[i].y);
27+
}
28+
ll l = max({1ll, mx_x - mn_x, mx_y - mn_y});
29+
return {l, {{{mn_x, mn_y}, l}, {{INF, INF}, 1}, {{INF + 2, INF + 2}, 1}}};
30+
}
31+
32+
pair<ll, vector<Square>> two() {
33+
// Sweep line
34+
ll l_best = INT_MAX;
35+
Square s1_best, s2_best;
36+
37+
multiset<ll> ys;
38+
for (int i = 1; i <= n; i++) ys.insert(points[i].y);
39+
sort(points + 1, points + n + 1,
40+
[](Point A, Point B) { return A.x < B.x; });
41+
ll mn_y = INT_MAX, mx_y = INT_MIN;
42+
for (int i = 1; i < n; i++) {
43+
mn_y = min(mn_y, points[i].y);
44+
mx_y = max(mx_y, points[i].y);
45+
ys.erase(ys.find(points[i].y));
46+
if (points[i].x == points[i + 1].x) continue;
47+
ll l = max({points[i].x - points[1].x, mx_y - mn_y,
48+
points[n].x - points[i + 1].x, *ys.rbegin() - *ys.begin(),
49+
1ll});
50+
if (l < l_best) {
51+
l_best = l;
52+
s1_best = {{points[i].x -
53+
max({points[i].x - points[1].x, mx_y - mn_y, 1ll}),
54+
mn_y},
55+
max({points[i].x - points[1].x, mx_y - mn_y, 1ll})};
56+
s2_best = {{points[i + 1].x, *ys.begin()},
57+
max({points[n].x - points[i + 1].x,
58+
*ys.rbegin() - *ys.begin(), 1ll})};
59+
}
60+
}
61+
62+
multiset<ll> xs;
63+
for (int i = 1; i <= n; i++) xs.insert(points[i].x);
64+
sort(points + 1, points + n + 1,
65+
[](Point A, Point B) { return A.y < B.y; });
66+
ll mn_x = INT_MAX, mx_x = INT_MIN;
67+
for (int i = 1; i < n; i++) {
68+
mn_x = min(mn_x, points[i].x);
69+
mx_x = max(mx_x, points[i].x);
70+
xs.erase(xs.find(points[i].x));
71+
if (points[i].y == points[i + 1].y) continue;
72+
ll l = max({points[i].y - points[1].y, mx_x - mn_x,
73+
points[n].y - points[i + 1].y, *xs.rbegin() - *xs.begin(),
74+
1ll});
75+
if (l < l_best) {
76+
l_best = l;
77+
s1_best = {{mn_x, points[i].y - max({points[i].y - points[1].y,
78+
mx_x - mn_x, 1ll})},
79+
max({points[i].y - points[1].y, mx_x - mn_x, 1ll})};
80+
s2_best = {{*xs.begin(), points[i + 1].y},
81+
max({points[n].y - points[i + 1].y,
82+
*xs.rbegin() - *xs.begin(), 1ll})};
83+
}
84+
}
85+
86+
return {l_best, {s1_best, s2_best, {{INF, INF}, 1}}};
87+
}
88+
89+
pair<ll, vector<Square>> three() {
90+
// Sweep line + greedy
91+
ll l_best = INT_MAX;
92+
Square s1_best, s2_best, s3_best;
93+
94+
sort(points + 1, points + n + 1,
95+
[](Point A, Point B) { return A.x < B.x; });
96+
for (int i = 2; i <= n; i++) {
97+
for (int j = i + 1; j <= n; j++) {
98+
99+
}
100+
101+
sort(points + i + 1, points + n + 1,
102+
[](Point A, Point B) { return A.y < B.y; });
103+
for (int j = i + 1; j <= n; j++) {
104+
105+
}
106+
sort(points + i + 1, points + n + 1,
107+
[](Point A, Point B) { return A.x < B.x; });
108+
}
109+
110+
return {l_best, {s1_best, s2_best, s3_best}};
111+
}
112+
113+
int main() {
114+
cin.tie(0)->sync_with_stdio(0);
115+
cin >> n >> k;
116+
for (int i = 1; i <= n; i++) cin >> points[i].x >> points[i].y;
117+
118+
vector<pair<ll, vector<Square>>> ans;
119+
if (k >= 1) ans.push_back(one());
120+
if (k >= 2) ans.push_back(two());
121+
if (k >= 3) ans.push_back(three());
122+
sort(ans.begin(), ans.end(),
123+
[](pair<ll, vector<Square>> A, pair<ll, vector<Square>> B) {
124+
return A.first < B.first;
125+
});
126+
for (int i = 0; i < k; i++)
127+
cout << ans[0].second[i].p.x << ' ' << ans[0].second[i].p.y << ' '
128+
<< ans[0].second[i].l << '\n';
129+
return 0;
130+
}

COI/COI 21-malnarisc.cpp

+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
#include <bits/stdc++.h>
2+
typedef long long ll;
3+
using namespace std;
4+
5+
vector<pair<int, int>> swaps[5000];
6+
7+
int swapsort(int l, int r) {
8+
if (l == r) return 0;
9+
10+
int mid = (l + r) / 2;
11+
int depth = max(swapsort(l, mid), swapsort(mid + 1, r));
12+
13+
for (int i = 0; i <= mid - l; i++) {
14+
for (int x = mid, y = r + (mid - l != r - mid - 1) - i; x >= l + i; x--, y--)
15+
if (y <= r) swaps[depth + 1 + i].push_back({x, y});
16+
}
17+
return depth + mid - l + 1;
18+
}
19+
20+
int main() {
21+
cin.tie(0)->sync_with_stdio(0);
22+
int n;
23+
cin >> n;
24+
int depth = swapsort(1, n);
25+
cout << depth << '\n';
26+
for (int i = 1; i <= depth; i++) {
27+
for (pair<int, int> j : swaps[i]) if (j.second <= n)
28+
cout << "CMPSWP R" << j.first << " R" << j.second << ' ';
29+
cout << '\n';
30+
}
31+
return 0;
32+
}

GCJ/GCJ 21-matrygons.cpp

+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
#include <bits/stdc++.h>
2+
typedef long long ll;
3+
using namespace std;
4+
5+
const int MX = 1e6;
6+
7+
int dp[MX + 1][2];
8+
vector<int> factors[MX + 1];
9+
10+
int main() {
11+
cin.tie(0)->sync_with_stdio(0);
12+
for (int i = 2; i <= MX; i++) {
13+
for (int j = i + i; j <= MX; j += i)
14+
factors[j].push_back(i);
15+
}
16+
dp[2][0] = 1;
17+
for (int i = 3; i <= MX; i++) {
18+
dp[i][0] = dp[i][1] = 1;
19+
for (int j : factors[i]) {
20+
dp[i][0] = max(dp[i][0], dp[j - 1][0] + 1);
21+
if (j * 2 != i)
22+
dp[i][1] = max(dp[i][1], dp[j - 1][0] + 1);
23+
}
24+
}
25+
int t;
26+
cin >> t;
27+
for (int test = 1; test <= t; test++) {
28+
int n;
29+
cin >> n;
30+
cout << "Case #" << test << ": " << dp[n][1] << '\n';
31+
}
32+
return 0;
33+
}

GCJ/GCJ 21-pancakes.cpp

+74
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
#include <bits/stdc++.h>
2+
typedef long long ll;
3+
using namespace std;
4+
5+
const ll MOD = 1e9 + 7;
6+
7+
ll fact[100001];
8+
9+
ll expo(ll base, ll pow) {
10+
ll ans = 1;
11+
while (pow) {
12+
if (pow & 1) ans = ans * base % MOD;
13+
base = base * base % MOD;
14+
pow >>= 1;
15+
}
16+
return ans;
17+
}
18+
19+
ll choose(int t, int m) {
20+
if (m > t || m < 0) return 0;
21+
return fact[t] * expo(fact[m], MOD - 2) % MOD * expo(fact[t - m], MOD - 2) % MOD;
22+
}
23+
24+
int n, v[100001];
25+
pair<int, int> segtree[400001];
26+
27+
void build(int node = 1, int l = 1, int r = n) {
28+
if (l == r) segtree[node] = {v[l], -l};
29+
else {
30+
int mid = (l + r) / 2;
31+
segtree[node * 2] = segtree[node * 2 + 1] = {INT_MAX, INT_MAX};
32+
build(node * 2, l, mid);
33+
build(node * 2 + 1, mid + 1, r);
34+
segtree[node] = min(segtree[node * 2], segtree[node * 2 + 1]);
35+
}
36+
}
37+
38+
pair<int, int> query(int a, int b, int node = 1, int l = 1, int r = n) {
39+
if (l >= a && r <= b) return segtree[node];
40+
if (l > b || r < a) return {INT_MAX, INT_MAX};
41+
int mid = (l + r) / 2;
42+
return min(query(a, b, node * 2, l, mid), query(a, b, node * 2 + 1, mid + 1, r));
43+
}
44+
45+
ll solve(int l = 1, int r = n) {
46+
if (r <= l) return 1;
47+
int mx_pos = -query(l, r).second;
48+
return choose(r - l, mx_pos - l) * solve(l, mx_pos - 1) % MOD * solve(mx_pos + 1, r) % MOD;
49+
}
50+
51+
int main() {
52+
cin.tie(0)->sync_with_stdio(0);
53+
fact[0] = 1;
54+
for (int i = 1; i <= 100000; i++)
55+
fact[i] = fact[i - 1] * i % MOD;
56+
int t;
57+
cin >> t;
58+
for (int test = 1; test <= t; test++) {
59+
cin >> n;
60+
bool good = true;
61+
for (int i = 1; i <= n; i++) {
62+
cin >> v[i];
63+
if (v[i] > v[i - 1] && v[i] - v[i - 1] != 1)
64+
good = false;
65+
}
66+
if (!good) {
67+
cout << "Case #" << test << ": 0\n";
68+
} else {
69+
build();
70+
cout << "Case #" << test << ": " << solve() << '\n';
71+
}
72+
}
73+
return 0;
74+
}

0 commit comments

Comments
 (0)