Skip to content

Commit 358dd75

Browse files
Add files via upload
1 parent d17b4fe commit 358dd75

File tree

4 files changed

+228
-0
lines changed

4 files changed

+228
-0
lines changed

Other_Tasks/CF2075_A_To_Zero.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
for _ in range(int(input())):
2+
3+
n, k = map(int, input().split())
4+
5+
ans = 0
6+
if n % 2 == 1:
7+
ans = 1
8+
n -= k
9+
10+
ans += (n + k - 1 - 1) // (k - 1)
11+
12+
print(ans)
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
for _ in range(int(input())):
2+
n, k = map(int, input().split())
3+
arr = list(map(int, input().split()))
4+
5+
if k >= 2:
6+
top_kp1 = sorted(arr, reverse=True)[: k + 1]
7+
print(sum(top_kp1))
8+
else:
9+
10+
x = arr[0] + arr[-1]
11+
if n > 2:
12+
y = max(arr[0], arr[-1]) + max(arr[1:-1])
13+
print(max(x, y))
14+
else:
15+
print(x)
Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
2+
#pragma GCC optimize("Ofast")
3+
#pragma GCC optimize("unroll-loops")
4+
#include <bits/stdc++.h>
5+
using namespace std;
6+
7+
typedef long long ll;
8+
typedef vector<int> vi;
9+
#define fast_cin() \
10+
ios_base::sync_with_stdio(false); \
11+
cin.tie(NULL); \
12+
cout.tie(NULL);
13+
14+
typedef long long ll;
15+
struct node {
16+
int s, e;
17+
ll mn, mx, sum, add_val, set_val;
18+
bool lset;
19+
node *l, *r;
20+
node(int _s, int _e, int A[] = NULL) : s(_s), e(_e), mn(0), mx(0), sum(0), lset(0), add_val(0), set_val(0), l(NULL), r(NULL) {
21+
if (A == NULL) return;
22+
if (s == e)
23+
mn = mx = sum = A[s];
24+
else {
25+
l = new node(s, (s + e) >> 1, A), r = new node((s + e + 2) >> 1, e, A);
26+
combine();
27+
}
28+
}
29+
void create_children() {
30+
if (s == e) return;
31+
if (l != NULL) return;
32+
int m = (s + e) >> 1;
33+
l = new node(s, m);
34+
r = new node(m + 1, e);
35+
}
36+
void self_set(ll v) {
37+
lset = 1;
38+
mn = mx = set_val = v;
39+
sum = v * (e - s + 1);
40+
add_val = 0;
41+
}
42+
void self_add(ll v) {
43+
if (lset) {
44+
self_set(v + set_val);
45+
return;
46+
}
47+
mn += v, mx += v, add_val += v;
48+
sum += v * (e - s + 1);
49+
}
50+
void lazy_propagate() {
51+
if (s == e) return;
52+
if (lset) {
53+
l->self_set(set_val), r->self_set(set_val);
54+
lset = set_val = 0;
55+
}
56+
if (add_val != 0) {
57+
l->self_add(add_val), r->self_add(add_val);
58+
add_val = 0;
59+
}
60+
}
61+
void combine() {
62+
if (l == NULL) return;
63+
sum = l->sum + r->sum;
64+
mn = min(l->mn, r->mn);
65+
mx = max(l->mx, r->mx);
66+
}
67+
#define UPDATE(name) \
68+
void name(int x, int y, ll v) { \
69+
if (s == x && e == y) { \
70+
self_##name(v); \
71+
return; \
72+
} \
73+
int m = (s + e) >> 1; \
74+
create_children(); \
75+
lazy_propagate(); \
76+
if (x <= m) l->name(x, min(y, m), v); \
77+
if (y > m) r->name(max(x, m + 1), y, v); \
78+
combine(); \
79+
}
80+
UPDATE(add) // generates add
81+
UPDATE(set) // generates set
82+
#define QUERY(name, fn, var, lazyfn) \
83+
ll range_##name(int x, int y) { \
84+
if (s == x && e == y) return var; \
85+
if (l == NULL || lset) return lazyfn(var); \
86+
int m = (s + e) >> 1; \
87+
lazy_propagate(); \
88+
if (y <= m) return l->range_##name(x, y); \
89+
if (x > m) return r->range_##name(x, y); \
90+
return fn(l->range_##name(x, m), r->range_##name(m + 1, y)); \
91+
}
92+
#define SAME(var) (var)
93+
#define PART(var) ((var) / (e - s + 1) * (y - x + 1))
94+
#define SUM(a, b) ((a) + (b))
95+
QUERY(min, min, mn, SAME) // generates range_min
96+
QUERY(max, max, mx, SAME) // generates range_max
97+
QUERY(sum, SUM, sum, PART) // generates range_sum
98+
~node() {
99+
if (l != NULL) delete l;
100+
if (r != NULL) delete r;
101+
}
102+
};
103+
104+
int main() {
105+
int tc;
106+
cin >> tc;
107+
while (tc--) {
108+
ll n, m;
109+
cin >> n >> m;
110+
node* st1 = new node(0, n - 1); // st1[i] is the number of previous colours that can paint i planks
111+
node* st2 = new node(0, n - 1); // st2[i] is the i * number of previous colours that can paint i planks
112+
113+
ll ans = 0;
114+
for (int i = 0; i < m; i++) {
115+
ll x;
116+
cin >> x;
117+
if (x == n) x--;
118+
119+
ll thres = n - 1 - x;
120+
ll sums2 = st2->range_sum(thres, n - 1);
121+
ll sums1 = st1->range_sum(thres, n - 1) * (x - n + 1);
122+
123+
ans += sums1 + sums2;
124+
125+
st1->add(x, x, 1);
126+
st2->add(x, x, x);
127+
}
128+
129+
delete st1;
130+
delete st2;
131+
132+
cout << ans * 2 << endl;
133+
}
134+
135+
return 0;
136+
}
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
#pragma GCC optimize("Ofast")
2+
#pragma GCC optimize("unroll-loops")
3+
#include <bits/stdc++.h>
4+
using namespace std;
5+
6+
typedef long long ll;
7+
typedef vector<int> vi;
8+
#define fast_cin() \
9+
ios_base::sync_with_stdio(false); \
10+
cin.tie(NULL); \
11+
cout.tie(NULL);
12+
13+
// vector<vector<vector<ll>>> memo;
14+
ll memo[70][70][70][64];
15+
ll dp(ll cur_lcp, ll a_left, ll b_left, ll next) {
16+
if (memo[cur_lcp][a_left][b_left][next] != -1) return memo[cur_lcp][a_left][b_left][next];
17+
if (a_left == b_left && a_left <= cur_lcp) return memo[cur_lcp][a_left][b_left][next] = 0; // we can just skip the rest
18+
19+
ll ans = 1e18;
20+
if (next + 1 <= 63) {
21+
ans = min(ans, dp(cur_lcp, a_left, b_left, next + 1)); // skip this one
22+
ans = min(ans, dp(cur_lcp, max(0LL, a_left - next), b_left, next + 1) + (1LL << next));
23+
ans = min(ans, dp(cur_lcp, a_left, max(0LL, b_left - next), next + 1) + (1LL << next));
24+
}
25+
return memo[cur_lcp][a_left][b_left][next] = ans;
26+
}
27+
28+
int main() {
29+
int tc;
30+
cin >> tc;
31+
memset(memo, -1, sizeof(memo));
32+
while (tc--) {
33+
ll x, y;
34+
cin >> x >> y;
35+
36+
// we find the longest common prefix of x and y in binary
37+
int xlen, ylen;
38+
if (x == 0)
39+
xlen = 0;
40+
else
41+
xlen = 64 - __builtin_clzll(x);
42+
43+
if (y == 0)
44+
ylen = 0;
45+
else
46+
ylen = 64 - __builtin_clzll(y);
47+
48+
ll lcp = 0;
49+
for (int i = 0; i < min(xlen, ylen); i++) {
50+
bool bitx = (x & (1LL << (xlen - 1 - i))) > 0;
51+
bool bity = (y & (1LL << (ylen - 1 - i))) > 0;
52+
if (bitx == bity)
53+
lcp++;
54+
else
55+
break;
56+
}
57+
58+
// cerr << "lcp: " << lcp << endl;
59+
// cerr << "xlen: " << xlen << " ylen: " << ylen << endl;
60+
// memo.assign(xlen + 2, vector<vector<ll>>(ylen + 2, vector<ll>(max(xlen, ylen) + 5, -1)));
61+
cout << dp(lcp, xlen, ylen, 1) << endl;
62+
}
63+
64+
return 0;
65+
}

0 commit comments

Comments
 (0)