Skip to content

Commit ed9bdb6

Browse files
Add files via upload
1 parent ee6a47b commit ed9bdb6

File tree

5 files changed

+265
-0
lines changed

5 files changed

+265
-0
lines changed
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
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+
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+
int main() {
15+
fast_cin();
16+
int t;
17+
cin >> t;
18+
while (t--) {
19+
ll n, x;
20+
cin >> n >> x;
21+
vector<ll> arr(n);
22+
for (int i = 0; i < n; ++i) {
23+
cin >> arr[i];
24+
}
25+
sort(arr.begin(), arr.end(), greater<ll>());
26+
27+
ll hi = accumulate(arr.begin(), arr.end(), 0LL);
28+
ll lo = hi / x;
29+
while (lo < hi) {
30+
vector<ll> h(x+2, 0);
31+
ll mid = lo + (hi - lo) / 2;
32+
h[0] = mid;
33+
bool valid = true;
34+
int pos = 0;
35+
for (int i = 0; i < n && valid; ++i) {
36+
assert(arr[i] > 0);
37+
ll cur = h[pos];
38+
ll nxt = h[pos+1];
39+
if (pos+1 >= x) nxt = 0;
40+
if (pos >= x) cur = 0;
41+
42+
if (cur + nxt < arr[i]){
43+
valid = false;
44+
break;
45+
}
46+
47+
ll takeFromCur = min(arr[i], cur);
48+
ll takeFromNxt = arr[i] - takeFromCur;
49+
assert(takeFromNxt <= nxt);
50+
51+
h[pos+2] = h[pos+2] + takeFromNxt;
52+
h[pos+1] = nxt - takeFromNxt + takeFromCur;
53+
h[pos] = cur - takeFromCur;
54+
55+
if (h[pos] == 0) pos++;
56+
}
57+
58+
if (valid) {
59+
hi = mid;
60+
} else {
61+
lo = mid + 1;
62+
}
63+
64+
65+
}
66+
cout << lo << endl;
67+
}
68+
return 0;
69+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
2+
t = int(input())
3+
for _ in range(t):
4+
x, y, k = map(int, input().split())
5+
6+
x = min(x, y)
7+
8+
print(0, 0, x, x)
9+
print(x, 0, 0, x)
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
inf = int(1e19)
2+
def checkMaxi(arr):
3+
n = len(arr)
4+
assert n % 2 == 0
5+
maxi = 0
6+
for i in range(0, n, 2):
7+
maxi = max(maxi, arr[i+1] - arr[i])
8+
9+
return maxi
10+
11+
t = int(input())
12+
for _ in range(t):
13+
n = int(input())
14+
arr = list(map(int, input().split()))
15+
if n == 1:
16+
print(1)
17+
continue
18+
if n % 2 == 0:
19+
print(checkMaxi(arr))
20+
else:
21+
best= inf
22+
for i in range(n):
23+
best = min(best, checkMaxi(arr[:i] + arr[i+1:]))
24+
25+
print(best)
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
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+
typedef long long ll;
8+
typedef vector<int> vi;
9+
#define fast_cin() ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
10+
11+
12+
13+
int main(){
14+
int tc;
15+
cin >> tc;
16+
while (tc--){
17+
int n;
18+
cin >> n;
19+
string s;
20+
cin >> s;
21+
22+
priority_queue<int> pq;
23+
ll cost = 0;
24+
for (int i=n; i>0; i--){
25+
if (s[i-1] == '1'){
26+
pq.push(i);
27+
}
28+
else{
29+
if (!pq.empty()){
30+
pq.pop();
31+
}
32+
cost += i;
33+
}
34+
}
35+
36+
vector<int> v;
37+
while (!pq.empty()){
38+
v.push_back(pq.top());
39+
pq.pop();
40+
}
41+
for (int i=v.size()/2; i<v.size(); i++){
42+
cost += v[i];
43+
}
44+
cout << cost << endl;
45+
}
46+
47+
return 0;
48+
}
Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
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+
typedef long long ll;
8+
typedef vector<int> vi;
9+
#define fast_cin() ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
10+
11+
template <typename T=ll>
12+
struct StaticSum {
13+
const int n;
14+
vector<T> pfs; // arr[i] contains the range sum from 0 to i inclusively
15+
16+
T rsq(int l, int r) const { // range sum from l to r inclusively
17+
if (l < 0 || r >= n) assert(false); // boundary condition check
18+
if (l == 0) return pfs[r];
19+
return (pfs[r] - pfs[l - 1]);
20+
}
21+
22+
StaticSum(const vector<T>& arr) : n(arr.size()), pfs(arr) {
23+
for (int i = 1; i < n; i++) {
24+
pfs[i] += pfs[i - 1];
25+
}
26+
}
27+
};
28+
29+
StaticSum<>* ss_brr_ptr;
30+
vector<ll> brr;
31+
vector<ll> segmentSums; // segmentSums[i] = sum of all a[j][k] within the segment i
32+
int n;
33+
34+
35+
pair<ll, ll> getComponents(ll idx){
36+
ll firstComponent = lower_bound(ss_brr_ptr->pfs.begin(), ss_brr_ptr->pfs.end(), idx) - ss_brr_ptr->pfs.begin();
37+
ll secondComponent = (firstComponent == 0 ? idx : idx - ss_brr_ptr->pfs[firstComponent-1]) - 1;
38+
return {firstComponent, secondComponent};
39+
}
40+
41+
ll topOfSegment(ll segmentIdx, ll includedRows, StaticSum<>& ss_ss_arr, StaticSum<>& ss_arr){ // gets the first sum of the first includedRows of the segment Idx
42+
ll ans = ss_ss_arr.rsq(0, segmentIdx+includedRows-1);
43+
if (segmentIdx > 0){
44+
ans -= ss_ss_arr.rsq(0, segmentIdx-1);
45+
ans -= (ss_arr.rsq(0, segmentIdx-1)) * (includedRows);
46+
}
47+
return ans;
48+
}
49+
50+
51+
ll getUntil(ll idx, StaticSum<>& ss_ss_arr, StaticSum<>& ss_arr, StaticSum<>& ss_segmentSums){ // inclusive of this current one...
52+
pair<ll, ll> components = getComponents(idx);
53+
// cerr << "components: " << components.first << " " << components.second << endl;
54+
ll ans = 0;
55+
if (components.first == 0){
56+
ans = topOfSegment(components.first, components.second+1, ss_ss_arr, ss_arr);
57+
}
58+
else{
59+
ans = ss_segmentSums.rsq(0, components.first-1) + topOfSegment(components.first, components.second+1, ss_ss_arr, ss_arr);
60+
// cerr << "top part " << topOfSegment(components.first, components.second+1, ss_ss_arr, ss_arr) << endl;
61+
}
62+
return ans;
63+
64+
}
65+
int main(){
66+
cin >> n;
67+
vector<ll> arr(n);
68+
for (int i=0; i<n; i++){
69+
cin >> arr[i];
70+
}
71+
72+
StaticSum<> ss_arr(arr);
73+
StaticSum<> ss_ss_arr(ss_arr.pfs);
74+
75+
segmentSums.assign(n, 0);
76+
segmentSums[0] = ss_ss_arr.rsq(0, n-1); // sum of prefixes
77+
for (int i=1; i<n; i++){
78+
segmentSums[i] = segmentSums[i-1] - (n-i+1) * arr[i-1];
79+
}
80+
// cerr << "segmentSums: ";
81+
// for (int i=0; i<n; i++){
82+
// cerr << segmentSums[i] << " ";
83+
// }
84+
// cerr << endl;
85+
StaticSum<> ss_segmentSums(segmentSums);
86+
87+
assert(segmentSums[n-1] == arr[n-1]);
88+
89+
brr.assign(n, 0);
90+
for (int i=0; i<n; i++){
91+
brr[i] = n-i;
92+
}
93+
ss_brr_ptr = new StaticSum<>(brr);
94+
95+
96+
int q;
97+
cin >> q;
98+
while (q--){
99+
ll top, bottom;
100+
cin >> top >> bottom;
101+
102+
if (top == 1){
103+
cout << getUntil(bottom, ss_ss_arr, ss_arr, ss_segmentSums) << endl;
104+
}
105+
else{
106+
cout << getUntil(bottom, ss_ss_arr, ss_arr, ss_segmentSums) - getUntil(top-1, ss_ss_arr, ss_arr, ss_segmentSums) << endl;
107+
}
108+
}
109+
110+
111+
112+
113+
return 0;
114+
}

0 commit comments

Comments
 (0)