Skip to content

Commit f031d6c

Browse files
Add files via upload
1 parent ea70307 commit f031d6c

File tree

5 files changed

+176
-0
lines changed

5 files changed

+176
-0
lines changed
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
for _ in range(int(input())):
2+
n = int(input())
3+
arr = list(map(int, input().split()))
4+
5+
arr.sort(reverse=True)
6+
7+
left = arr[: n + 1]
8+
right = arr[n + 1 :]
9+
10+
gap = sum(left) - sum(right)
11+
right.append(gap)
12+
13+
for i in range(2 * n + 1):
14+
if i % 2 == 1:
15+
print(right[i // 2], end=" ")
16+
else:
17+
print(left[i // 2], end=" ")
18+
print()
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
from sys import stdout
2+
mask_even = 0
3+
for i in range(0, 30, 2):
4+
mask_even += 1 << i
5+
6+
mask_odd = 0
7+
for i in range(1, 30, 2):
8+
mask_odd += 1 << i
9+
10+
ZEROS = 0
11+
MIX = 1
12+
ONES = 2
13+
14+
for _ in range(int(input())):
15+
print(mask_even)
16+
stdout.flush()
17+
even_res = int(input())
18+
19+
print(mask_odd)
20+
stdout.flush()
21+
odd_res = int(input())
22+
23+
numbers = [None] * 30
24+
25+
for i in range(2, 30, 2):
26+
# refer to mask odd to find the even bit patterns
27+
at_i = odd_res & (1 << i)
28+
at_ip1 = odd_res & (1 << (i + 1))
29+
30+
if at_i and at_ip1:
31+
numbers[i] = ONES
32+
elif at_i and not at_ip1:
33+
numbers[i] = ZEROS
34+
elif not at_i and at_ip1:
35+
numbers[i] = MIX
36+
else:
37+
assert False
38+
39+
at_0 = odd_res & 1
40+
at_1 = odd_res & 2
41+
if not at_0 and not at_1:
42+
numbers[0] = ZEROS
43+
elif at_0 and not at_1:
44+
numbers[0] = MIX
45+
elif not at_0 and at_1:
46+
numbers[0] = ONES
47+
else:
48+
assert False
49+
50+
for i in range(1, 30, 2):
51+
# refer to mask even to find the odd bit patterns
52+
at_i = even_res & (1 << i)
53+
at_ip1 = even_res & (1 << (i + 1))
54+
55+
if at_i and at_ip1:
56+
numbers[i] = ONES
57+
elif at_i and not at_ip1:
58+
numbers[i] = ZEROS
59+
elif not at_i and at_ip1:
60+
numbers[i] = MIX
61+
else:
62+
assert False
63+
64+
x = 0
65+
y = 0
66+
for i in range(0, 30):
67+
if numbers[i] == MIX:
68+
y += 1 << i
69+
elif numbers[i] == ONES:
70+
x += 1 << i
71+
y += 1 << i
72+
73+
print("!")
74+
stdout.flush()
75+
m = int(input())
76+
print((x | m) + (y | m))
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
for _ in range(int(input())):
2+
n, x = map(int, input().split())
3+
print("YES" if sum(map(int, input().split())) == n * x else "NO")
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
for _ in range(int(input())):
2+
n, k = map(int, input().split())
3+
4+
if k % 2 == 1:
5+
ans = [n] * (n - 1) + [n - 1]
6+
else:
7+
ans = [n - 1] * (n - 2) + [n] + [n - 1]
8+
9+
print(*ans)
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 optimize("unroll-loops")
3+
#include <bits/stdc++.h>
4+
using namespace std;
5+
typedef long long ll;
6+
7+
int n;
8+
vector<ll> to_add;
9+
vector<pair<ll, ll>> factor;
10+
vector<vector<ll>> memo;
11+
ll dp(ll idx, int side) {
12+
if (idx == n) return 1;
13+
if (memo[idx][side] != -1) return memo[idx][side];
14+
15+
if (side == 0) {
16+
return memo[idx][side] = dp(idx + 1, 0) + max(dp(idx + 1, 0), dp(idx + 1, 1)) * (factor[idx].first - 1);
17+
} else {
18+
return memo[idx][side] = dp(idx + 1, 1) + max(dp(idx + 1, 1), dp(idx + 1, 0)) * (factor[idx].second - 1);
19+
}
20+
}
21+
22+
int main() {
23+
int tc;
24+
cin >> tc;
25+
while (tc--) {
26+
cin >> n;
27+
to_add.assign(n, 0);
28+
factor.assign(n, {0, 0});
29+
30+
for (int i = 0; i < n; i++) {
31+
char left_op, right_op;
32+
ll left_num, right_num;
33+
34+
cin >> left_op >> left_num >> right_op >> right_num;
35+
36+
if (left_op == '+') {
37+
factor[i].first = 1;
38+
to_add[i] += left_num;
39+
} else {
40+
factor[i].first = left_num;
41+
}
42+
43+
if (right_op == '+') {
44+
factor[i].second = 1;
45+
to_add[i] += right_num;
46+
} else {
47+
factor[i].second = right_num;
48+
}
49+
}
50+
51+
memo.assign(n, vector<ll>(2, -1));
52+
53+
ll onLeft = 1;
54+
ll onRight = 1;
55+
for (int i = 0; i < n; i++) {
56+
ll additional = to_add[i] + (factor[i].first - 1) * onLeft + (factor[i].second - 1) * onRight;
57+
if (dp(i + 1, 0) > dp(i + 1, 1)) {
58+
// better value to add to the left
59+
onLeft += additional;
60+
} else {
61+
// better value to add to the right
62+
onRight += additional;
63+
}
64+
}
65+
66+
cout << onLeft + onRight << endl;
67+
}
68+
69+
return 0;
70+
}

0 commit comments

Comments
 (0)