Skip to content

Commit 1186cab

Browse files
Add files via upload
1 parent eca63f0 commit 1186cab

File tree

4 files changed

+156
-0
lines changed

4 files changed

+156
-0
lines changed
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
from collections import Counter
2+
3+
tc = int(input())
4+
for _ in range(tc):
5+
n = int(input())
6+
c = Counter(list(input()))
7+
ans = sum(min(n, c[x]) for x in 'ABCD')
8+
print(ans)
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
t = int(input())
2+
for _ in range(t):
3+
n = int(input())
4+
arr = list(map(int, input().split()))
5+
6+
evens = list(filter(lambda x: x % 2 == 0, arr))
7+
odds = list(filter(lambda x: x % 2 != 0, arr))
8+
9+
if len(evens) == 0 or len(odds) == 0:
10+
print(0)
11+
continue
12+
13+
cur = max(odds)
14+
evens.sort()
15+
bigeven = evens[-1]
16+
17+
ans = 0
18+
for e in evens:
19+
while cur < e:
20+
cur += bigeven
21+
ans += 1
22+
23+
cur += e
24+
ans += 1
25+
26+
print(ans)
27+
28+
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
#pragma GCC optimize("Ofast")
2+
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,avx2,fma")
3+
#pragma GCC optimize("unroll-loops")
4+
#include <bits/stdc++.h>
5+
using namespace std;
6+
7+
int n, k;
8+
vector<int> v;
9+
int main() {
10+
int tc;
11+
cin >> tc;
12+
13+
while (tc--) {
14+
cin >> n >> k;
15+
v.assign(2 * k, 0);
16+
17+
int over = 0;
18+
int maxq = 0;
19+
int maxa = 0;
20+
for (int i = 0; i < n; i++) {
21+
int x;
22+
cin >> x;
23+
maxq = max(maxq, x / (2 * k)); // number of periods before last room activated
24+
maxa = max(maxa, x); // number of rooms activated in last period
25+
x %= (2 * k);
26+
v[x]++;
27+
v[(x + k) % (2 * k)]--;
28+
if (x >= k) over++;
29+
}
30+
31+
int cur = over;
32+
vector<int> possible(2 * k, 0);
33+
for (int i = 0; i < 2 * k; i++) {
34+
cur += v[i];
35+
if (cur == n) possible[i] = 1;
36+
}
37+
38+
int minTime = -1;
39+
for (int i = maxa; i < maxa + k; i++) {
40+
if (possible[i % (2 * k)]) {
41+
minTime = i;
42+
break;
43+
}
44+
}
45+
46+
cout << minTime << endl;
47+
}
48+
49+
return 0;
50+
}

Other_Tasks/CF1993_D_Med_imize.cpp

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
#pragma GCC optimize("Ofast")
2+
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,avx2,fma")
3+
#pragma GCC optimize("unroll-loops")
4+
#include <bits/stdc++.h>
5+
using namespace std;
6+
7+
#define fast_cin() \
8+
ios_base::sync_with_stdio(false); \
9+
cin.tie(NULL); \
10+
cout.tie(NULL);
11+
12+
int n, k;
13+
constexpr int inf = 1e9;
14+
constexpr int maxn = 5e5 + 1;
15+
vector<int> arr;
16+
vector<vector<int>> memo;
17+
vector<int> suffixAtLeastX;
18+
int totalSegments, toRemain, x;
19+
20+
int dp(int a, int b) { // dp(a, b) = maximum number of additional remaining elements > = x assuming that we already have a remaining numbers and used b k segments
21+
if (memo[a][b] != -1) return memo[a][b];
22+
if (a == toRemain) return memo[a][b] = 0; // already collected everything
23+
int idx = a + b * k;
24+
if (idx == n) return memo[a][b] = 0; // no more able to take
25+
int ans = dp(a + 1, b) + (arr[idx] >= x);
26+
if (idx + k < n) ans = max(ans, dp(a, b + 1));
27+
28+
return memo[a][b] = ans;
29+
}
30+
31+
inline bool medAtLeast(int target) { // true iff the median achieved can be at least x
32+
x = target;
33+
memo.assign(toRemain + 1, vector<int>(totalSegments + 1, -1));
34+
return dp(0, 0) >= (toRemain + 2) / 2;
35+
}
36+
37+
int main() {
38+
fast_cin();
39+
int tc;
40+
cin >> tc;
41+
arr.resize(maxn);
42+
suffixAtLeastX.resize(maxn);
43+
while (tc--) {
44+
cin >> n >> k;
45+
totalSegments = (n - 1) / k;
46+
toRemain = n - k * totalSegments;
47+
48+
int top = 0;
49+
for (int i = 0; i < n; i++) {
50+
cin >> arr[i];
51+
top = max(top, arr[i]);
52+
}
53+
54+
int hi = top;
55+
int lo = 1;
56+
57+
while (hi > lo) {
58+
int mid = (hi + lo + 1) / 2;
59+
if (medAtLeast(mid)) {
60+
lo = mid;
61+
} else {
62+
hi = mid - 1;
63+
}
64+
}
65+
66+
cout << lo << endl;
67+
}
68+
69+
return 0;
70+
}

0 commit comments

Comments
 (0)