Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit a17ecb1

Browse files
Create Equal Cut Explanation.txt
1 parent f061174 commit a17ecb1

File tree

1 file changed

+118
-0
lines changed

1 file changed

+118
-0
lines changed
Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
We will cut the array in 4 subarrays with 3 endpoints - i, j, k
2+
3+
Let us fix j and find the best i and best k for every j.
4+
5+
We will then choose the j that minimizes the difference of the 4 segments.
6+
7+
-----
8+
9+
Now, let us discuss how to find the best i for a given j ?
10+
We want to know the best way to split [1, j] into [1, i] and [i + 1, j] such that the difference in their sums is minimized.
11+
12+
We can do this by binary searching for i for every j.
13+
14+
We can also make another beautiful observation.
15+
Let Answer(j) denote the best value of i for j
16+
17+
Then, Answer(j + 1) >= Answer(j)
18+
19+
We can now use two pointers and use this to find the best i for each j by starting from the best i for the previous j !
20+
21+
This is O(n) as every element is touched at most twice.
22+
23+
24+
-----
25+
26+
We will do a similar thing for the suffix in splitting [j + 1, n] into [j + 1, k - 1] and [k, n]
27+
28+
-----
29+
30+
#include <iostream>
31+
#include <vector>
32+
#include <algorithm>
33+
34+
using namespace std;
35+
36+
long long find_difference(long long a, long long b, long long c, long long d)
37+
{
38+
long long minimum = min(min(a, b), min(c, d));
39+
long long maximum = max(max(a, b), max(c, d));
40+
41+
return maximum - minimum;
42+
}
43+
44+
int main()
45+
{
46+
int no_of_elements;
47+
cin >> no_of_elements;
48+
49+
vector <int> A(no_of_elements + 1);
50+
for(int i = 1; i <= no_of_elements; i++)
51+
{
52+
cin >> A[i];
53+
}
54+
55+
vector <long long> sum(no_of_elements + 1);
56+
for(int i = 1; i <= no_of_elements; i++)
57+
{
58+
sum[i] = sum[i - 1] + A[i];
59+
}
60+
61+
vector <long long> best_P(no_of_elements + 1), best_Q(no_of_elements + 1);
62+
for(int i = 1, j = 2; j <= no_of_elements; j++)
63+
{
64+
//[1, i], [i + 1, j]
65+
int break_point = i;
66+
for(break_point = i; break_point < j; break_point++)
67+
{
68+
long long segment_1 = sum[break_point], segment_2 = sum[j] - sum[break_point];
69+
long long segment_1_before = sum[break_point - 1], segment_2_before = sum[j] - sum[break_point - 1];
70+
//cout << "j = " << j << " Before " << segment_1_before << " " << segment_2_before << " Now " << segment_1 << " " << segment_2 << "\n";
71+
72+
if(abs(segment_2 - segment_1) <= abs(segment_1_before - segment_2_before))
73+
{
74+
i = break_point;
75+
}
76+
else
77+
{
78+
break;
79+
}
80+
}
81+
82+
best_P[j] = sum[i], best_Q[j] = sum[j] - sum[i];
83+
}
84+
85+
vector <long long> best_R(no_of_elements + 1), best_S(no_of_elements);
86+
for(int k = no_of_elements, j = no_of_elements - 1; j >= 1; j--)
87+
{
88+
//[j + 1, k - 1], [k, n]
89+
int break_point = k;
90+
for(break_point = k; break_point > j; break_point--)
91+
{
92+
long long segment_3 = sum[break_point - 1] - sum[j], segment_4 = sum[no_of_elements] - sum[break_point - 1];
93+
long long segment_3_before = sum[break_point] - sum[j], segment_4_before = sum[no_of_elements] - sum[break_point];
94+
95+
if(abs(segment_3 - segment_4) <= abs(segment_3_before - segment_4_before))
96+
{
97+
k = break_point;
98+
}
99+
else
100+
{
101+
break;
102+
}
103+
}
104+
105+
best_R[j] = sum[k - 1] - sum[j], best_S[j] = sum[no_of_elements] - sum[k - 1];
106+
}
107+
108+
const long long oo = 1e18;
109+
long long answer = oo;
110+
for(int j = 2; j < no_of_elements; j++)
111+
{
112+
//cout << "j = " << j << "(" << best_P[j] << "," << best_Q[j] << "," << best_R[j] << "," << best_S[j] << ")\n";
113+
answer = min(answer, find_difference(best_P[j], best_Q[j], best_R[j], best_S[j]));
114+
}
115+
116+
cout << answer << "\n";
117+
return 0;
118+
}

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /