Skip to content

Commit 8a4b7d2

Browse files
Add files via upload
1 parent 58e28c9 commit 8a4b7d2

File tree

1 file changed

+108
-0
lines changed

1 file changed

+108
-0
lines changed
Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
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+
#define fast_cin() \
8+
ios_base::sync_with_stdio(false); \
9+
cin.tie(NULL); \
10+
cout.tie(NULL);
11+
12+
set<ll> sums;
13+
14+
void processHeights(vector<ll> &h) {
15+
int n = h.size();
16+
ll maxSeen = h[n - 1];
17+
ll minSeen = h[n - 1];
18+
19+
ll biggestDown = 0;
20+
ll biggestUp = 0;
21+
22+
for (int i = n - 2; i >= 0; i--) {
23+
ll down = minSeen - h[i];
24+
ll up = maxSeen - h[i];
25+
26+
biggestDown = min(biggestDown, down);
27+
biggestUp = max(biggestUp, up);
28+
29+
minSeen = min(minSeen, h[i]);
30+
maxSeen = max(maxSeen, h[i]);
31+
}
32+
33+
for (ll i = biggestDown; i <= biggestUp; i++) {
34+
sums.insert(i);
35+
}
36+
}
37+
38+
int main() {
39+
fast_cin();
40+
int tc;
41+
cin >> tc;
42+
while (tc--) {
43+
int n;
44+
vector<ll> rightActions, leftActions;
45+
vector<ll> right;
46+
vector<ll> left;
47+
sums.clear();
48+
49+
cin >> n;
50+
51+
vector<ll> arr(n);
52+
ll x = 0;
53+
int xidx = 0;
54+
for (int i = 0; i < n; i++) {
55+
cin >> arr[i];
56+
if (arr[i] > 1 || arr[i] < -1) {
57+
xidx = i;
58+
}
59+
}
60+
x = arr[xidx];
61+
62+
leftActions = vector<ll>(arr.begin(), arr.begin() + xidx);
63+
rightActions = vector<ll>(arr.begin() + xidx + 1, arr.end());
64+
65+
ll sumLeft = 0;
66+
for (int i = 0; i < leftActions.size(); i++) {
67+
sumLeft += leftActions[i];
68+
}
69+
70+
left.assign(leftActions.size() + 1, 0);
71+
left[0] = -sumLeft;
72+
for (int i = 1; i < left.size(); i++) {
73+
left[i] = left[i - 1] + leftActions[i - 1];
74+
}
75+
assert(left.back() == 0);
76+
77+
right.assign(rightActions.size() + 1, 0);
78+
right[0] = 0;
79+
for (int i = 1; i < right.size(); i++) {
80+
right[i] = right[i - 1] + rightActions[i - 1];
81+
}
82+
83+
processHeights(left);
84+
processHeights(right);
85+
86+
ll maxLeft = *max_element(left.begin(), left.end());
87+
ll minLeft = *min_element(left.begin(), left.end());
88+
ll maxRight = *max_element(right.begin(), right.end());
89+
ll minRight = *min_element(right.begin(), right.end());
90+
91+
ll up = maxRight - minLeft;
92+
for (int i = 0; i <= up; i++) {
93+
sums.insert(i + x);
94+
}
95+
96+
ll down = minRight - maxLeft;
97+
for (int i = down; i <= 0; i++) {
98+
sums.insert(i + x);
99+
}
100+
101+
cout << sums.size() << endl;
102+
for (auto i : sums) {
103+
cout << i << " ";
104+
}
105+
cout << endl;
106+
}
107+
return 0;
108+
}

0 commit comments

Comments
 (0)