Skip to content

Commit 7a77dba

Browse files
committed
Codeforces rounds
1 parent f41f41d commit 7a77dba

File tree

10 files changed

+560
-0
lines changed

10 files changed

+560
-0
lines changed

codeforces/237/c.cpp

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
#include <cstdio>
2+
#include <cstring>
3+
4+
using namespace std;
5+
6+
const int MAXN = 1000006;
7+
8+
// sieve[i] = 0 iff i is prime
9+
bool sieve[MAXN];
10+
int cum[MAXN];
11+
12+
int a, b, k;
13+
14+
void gen_sieve() {
15+
memset(sieve, 0, sizeof(sieve));
16+
sieve[0] = sieve[1] = 1;
17+
for (int i = 4; i < MAXN; i += 2) {
18+
sieve[i] = 1;
19+
}
20+
21+
for (int i = 3; i < MAXN; i += 2) {
22+
if (!sieve[i]) {
23+
for (long long j = 1LL * i * i; j < MAXN; j += i) {
24+
sieve[j] = 1;
25+
}
26+
}
27+
}
28+
}
29+
30+
void gen_cum() {
31+
cum[0] = 0;
32+
for (int i = 1; i < MAXN; ++i) {
33+
cum[i] = cum[i - 1] + (sieve[i] == 0);
34+
}
35+
}
36+
37+
bool works(int l) {
38+
for (int x = a; x + l - 1 <= b; ++x) {
39+
// printf("Interval [%d, %d] has %d primes\n", x, x + l - 1, cum[x + l - 1] - cum[x - 1]);
40+
if (cum[x + l - 1] - cum[x - 1] < k)
41+
return false;
42+
}
43+
44+
return true;
45+
}
46+
47+
int main() {
48+
scanf("%d %d %d", &a, &b, &k);
49+
50+
gen_sieve();
51+
gen_cum();
52+
53+
if (!works(b - a + 1)) {
54+
printf("%d\n", -1);
55+
} else if (works(1)) {
56+
printf("%d\n", 1);
57+
} else {
58+
int lo = 1;
59+
int hi = b - a + 1;
60+
while (lo + 1 < hi) {
61+
int mid = (lo + hi) / 2;
62+
if (works(mid)) {
63+
hi = mid;
64+
} else {
65+
lo = mid;
66+
}
67+
}
68+
69+
printf("%d\n", hi);
70+
}
71+
72+
return 0;
73+
}

codeforces/475/b.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
def main():
2+
n, m = map(int, input().split())
3+
a = input()
4+
b = input()
5+
6+
valid = (a[0] == '>' and a[-1] == '<' and b[0] == '^' and b[-1] == 'v') \
7+
or (a[0] == '<' and a[-1] == '>' and b[0] == 'v' and b[-1] == '^')
8+
9+
print("YES" if valid else "NO")
10+
11+
main()

codeforces/609/e.cpp

Lines changed: 170 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,170 @@
1+
#include <cstdio>
2+
#include <cstring>
3+
#include <cmath>
4+
#include <algorithm>
5+
#include <utility>
6+
#include <vector>
7+
#include <queue>
8+
9+
using namespace std;
10+
11+
const int MAXN = 200005;
12+
const int LOGN = 19;
13+
int n, m;
14+
15+
struct edge {
16+
int u, v, w;
17+
bool operator<(const edge& other) const {
18+
return w < other.w;
19+
}
20+
};
21+
22+
vector<edge> edges;
23+
24+
int uf[MAXN];
25+
26+
void init() {
27+
for (int i = 1; i <= n; ++i)
28+
uf[i] = i;
29+
}
30+
31+
int find(int x) {
32+
int p = uf[x];
33+
if (uf[p] != p)
34+
p = find(p);
35+
36+
return uf[x] = p;
37+
}
38+
39+
void join(int x, int y) {
40+
int xr = find(x);
41+
int yr = find(y);
42+
if (xr == yr) return;
43+
44+
uf[xr] = yr;
45+
}
46+
47+
vector<pair<int, int> > tree[MAXN];
48+
int parent[MAXN][LOGN];
49+
int big[MAXN][LOGN];
50+
int depth[MAXN];
51+
52+
long long find_mst() {
53+
vector<edge> sorted(edges.begin(), edges.end());
54+
sort(sorted.begin(), sorted.end());
55+
56+
init();
57+
long long mst_cost = 0LL;
58+
for (const edge& edg : sorted) {
59+
if (find(edg.u) != find(edg.v)) {
60+
tree[edg.u].push_back({edg.v, edg.w});
61+
tree[edg.v].push_back({edg.u, edg.w});
62+
join(edg.u, edg.v);
63+
mst_cost += edg.w;
64+
}
65+
}
66+
67+
return mst_cost;
68+
}
69+
70+
void dfs(int node, int par, int dep) {
71+
parent[node][0] = par;
72+
depth[node] = dep;
73+
for (pair<int, int> child : tree[node]) {
74+
if (child.first != par) {
75+
dfs(child.first, node, dep + 1);
76+
big[child.first][0] = child.second;
77+
}
78+
}
79+
}
80+
81+
void gen_parents() {
82+
for (int j = 1; j < LOGN; ++j) {
83+
for (int i = 1; i <= n; ++i) {
84+
if (parent[i][j - 1] != -1) {
85+
parent[i][j] = parent[parent[i][j - 1]][j - 1];
86+
big[i][j] = max(big[i][j - 1], big[parent[i][j - 1]][j - 1]);
87+
}
88+
}
89+
}
90+
}
91+
92+
int walk_up(int node, int move) {
93+
int par = node;
94+
for (int j = 0, p = 1; par != -1 and p <= move; ++j, p <<= 1) {
95+
if (move & p) {
96+
par = parent[par][j];
97+
}
98+
}
99+
100+
return par;
101+
}
102+
103+
int find_max(int node, int move) {
104+
int loc = node;
105+
int val = 0;
106+
107+
for (int j = 0, p = 1; loc != -1 and p <= move; ++j, p <<= 1) {
108+
if (move & p) {
109+
val = max(val, big[loc][j]);
110+
loc = parent[loc][j];
111+
}
112+
}
113+
114+
return val;
115+
}
116+
117+
int lca(int x, int y) {
118+
if (depth[x] > depth[y])
119+
return lca(y, x);
120+
if (depth[x] < depth[y])
121+
y = walk_up(y, depth[y] - depth[x]);
122+
123+
if (x == y) return x;
124+
125+
int lo = 0;
126+
int hi = n;
127+
while (lo + 1 < hi) {
128+
int mid = (lo + hi) / 2;
129+
if (walk_up(x, mid) == walk_up(y, mid))
130+
hi = mid;
131+
else
132+
lo = mid;
133+
}
134+
135+
return walk_up(x, hi);
136+
}
137+
138+
int main() {
139+
scanf("%d %d", &n, &m);
140+
141+
int u, v, w;
142+
for (int i = 0; i < m; ++i) {
143+
scanf("%d %d %d", &u, &v, &w);
144+
145+
edges.push_back({u, v, w});
146+
}
147+
148+
long long cost = find_mst();
149+
memset(parent, -1, sizeof(parent));
150+
dfs(1, -1, 0);
151+
gen_parents();
152+
153+
for (int i = 0; i < m; ++i) {
154+
u = edges[i].u;
155+
v = edges[i].v;
156+
157+
int l = lca(u, v);
158+
// printf("%d %d %d\n", u, v, l);
159+
if ((l == u or l == v) and (depth[u] - depth[v] == 1 or depth[v] - depth[u] == 1)) {
160+
printf("%lld\n", cost);
161+
} else {
162+
long long m1 = find_max(u, depth[u] - depth[l]);
163+
long long m2 = find_max(v, depth[v] - depth[l]);
164+
165+
printf("%lld\n", cost - max(m1, m2) + edges[i].w);
166+
}
167+
}
168+
169+
return 0;
170+
}

codeforces/660/a.cpp

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
#include <cstdio>
2+
#include <vector>
3+
4+
using namespace std;
5+
6+
inline int gcd(int a, int b) {
7+
return b == 0 ? a : gcd(b, a % b);
8+
}
9+
10+
int main() {
11+
int n;
12+
scanf("%d", &n);
13+
14+
vector<int> vals;
15+
int x;
16+
scanf("%d", &x);
17+
vals.push_back(x);
18+
19+
int extra = 0;
20+
for (int i = 1; i < n; ++i) {
21+
scanf("%d", &x);
22+
if (gcd(vals.back(), x) > 1) {
23+
++extra;
24+
vals.push_back(1);
25+
}
26+
27+
vals.push_back(x);
28+
}
29+
30+
printf("%d\n", extra);
31+
for (int x : vals)
32+
printf("%d ", x);
33+
printf("\n");
34+
35+
return 0;
36+
}

codeforces/675/d.cpp

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
#include <cstdio>
2+
#include <cassert>
3+
#include <set>
4+
5+
using namespace std;
6+
7+
set<int> full_left;
8+
set<int> full_right;
9+
10+
set<int> values;
11+
set<int> neg_values;
12+
13+
int main() {
14+
int n;
15+
scanf("%d", &n);
16+
17+
int x;
18+
scanf("%d", &x);
19+
20+
values.insert(x);
21+
neg_values.insert(-x);
22+
23+
for (int i = 1; i < n; ++i) {
24+
scanf("%d", &x);
25+
// handle the edge cases
26+
if (x < *values.begin()) {
27+
full_left.insert(*values.begin());
28+
printf("%d ", *values.begin());
29+
} else if (x > *values.rbegin()) {
30+
full_right.insert(*values.rbegin());
31+
printf("%d ", *values.rbegin());
32+
} else {
33+
// find the nodes surrounding x
34+
int lower = -1 * (*neg_values.upper_bound(-x));
35+
int upper = *values.upper_bound(x);
36+
37+
// printf("%d %d %d\n", lower, x, upper);
38+
assert(full_right.count(lower) ^ full_left.count(upper));
39+
if (full_right.find(lower) == full_right.end()) {
40+
full_right.insert(lower);
41+
printf("%d ", lower);
42+
} else {
43+
full_left.insert(upper);
44+
printf("%d ", upper);
45+
}
46+
}
47+
48+
values.insert(x);
49+
neg_values.insert(-x);
50+
}
51+
}

0 commit comments

Comments
 (0)