Given a set of **n** points **(x _{i}, y_{i})** in 2D coordinate. Each point has some weight

**w**. The task is to check whether a line at 45 degree can be drawn so that sum of weights of points on each side are equal.

_{i}Examples:

Input : x1 = -1, y1 = 1, w1 = 3 x2 = -2, y2 = 1, w2 = 1 x3 = 1, y3 = -1, w3 = 4 Output : Yes Input : x1 = 1, y1 = 1, w1 = 2 x2 = -1, y2 = 1, w2 = 1 x3 = 1, y3 = -1, w3 = 2 Output : No

First, let’s try to solve above problem for a vertical line i.e if a line x = i can divide the plane into two part such that the sum of weight at each side is equal.

Observe, multiple points with the same x-coordinate can be treated as one point with weight equal to the sum of weights of all points with the same x-coordinate.

Now, traverse through all x-coordinates from the minimum x-coordinate to maximum x-coordinate. So, make an array **prefix_sum[]**, which will store the sum of weights till the point **x = i**.

So, there can be two options for which the answer can be ‘Yes’:

- Either prefix_sum[1, 2, …, i-1] = prefix_sum[i+1, …, n]
- or there exist a point i such that a line passes somewhere in between

x = i and x = i+1 and prefix_sum[1, …, i] = prefix_sum[i+1, …, n],

where prefix_sum[i, …, j] is the sum of weight of points from i to j.

int is_possible = false; for (int i = 1; i < prefix_sum.size(); i++) if (prefix_sum[i] == total_sum - prefix_sum[i]) is_possible = true if (prefix_sum[i-1] == total_sum - prefix_sum[i]) is_possible = true

Now, to solve for a line at 45 degrees, we will rotate each point by 45 degrees.

Refer: 2D Transformation or Rotation of objects

So, point at (x, y), after 45 degree rotation will become ((x – y)/sqrt(2), (x + y)/sqrt(2)).

We can ignore the sqrt(2) since it is the scaling factor. Also, we don’t need to care about y-coordinate after rotation because a vertical line cannot distinguish between the point having the same x-coordinate. (x, y_{1}) and (x, y_{2}) will lie to the right, left or on any line of the form x = k.

`#include <bits/stdc++.h> ` `using` `namespace` `std; ` ` ` `// Checking if a plane can be divide by a line ` `// at 45 degrees such that weight sum is equal ` `void` `is_partition_possible(` `int` `n, ` `int` `x[], ` ` ` `int` `y[], ` `int` `w[]) ` `{ ` ` ` `map<` `int` `, ` `int` `> weight_at_x; ` ` ` `int` `max_x = -2e3, min_x = 2e3; ` ` ` ` ` `// Rotating each point by 45 degrees and ` ` ` `// calculating prefix sum. ` ` ` `// Also, finding maximum and minimum x ` ` ` `// coordinates ` ` ` `for` `(` `int` `i = 0; i < n; i++) { ` ` ` `int` `new_x = x[i] - y[i]; ` ` ` `max_x = max(max_x, new_x); ` ` ` `min_x = min(min_x, new_x); ` ` ` ` ` `// storing weight sum upto x - y point ` ` ` `weight_at_x[new_x] += w[i]; ` ` ` `} ` ` ` ` ` `vector<` `int` `> sum_till; ` ` ` `sum_till.push_back(0); ` ` ` ` ` `// Finding prefix sum ` ` ` `for` `(` `int` `x = min_x; x <= max_x; x++) { ` ` ` `sum_till.push_back(sum_till.back() + ` ` ` `weight_at_x[x]); ` ` ` `} ` ` ` ` ` `int` `total_sum = sum_till.back(); ` ` ` ` ` `int` `partition_possible = ` `false` `; ` ` ` `for` `(` `int` `i = 1; i < sum_till.size(); i++) { ` ` ` `if` `(sum_till[i] == total_sum - sum_till[i]) ` ` ` `partition_possible = ` `true` `; ` ` ` ` ` `// Line passes through i, so it neither ` ` ` `// falls left nor right. ` ` ` `if` `(sum_till[i - 1] == total_sum - sum_till[i]) ` ` ` `partition_possible = ` `true` `; ` ` ` `} ` ` ` ` ` `printf` `(partition_possible ? ` `"YES\n"` `: ` `"NO\n"` `); ` `} ` ` ` `// Driven Program ` `int` `main() ` `{ ` ` ` `int` `n = 3; ` ` ` `int` `x[] = { -1, -2, 1 }; ` ` ` `int` `y[] = { 1, 1, -1 }; ` ` ` `int` `w[] = { 3, 1, 4 }; ` ` ` `is_partition_possible(n, x, y, w); ` ` ` ` ` `return` `0; ` `} ` |

*chevron_right*

*filter_none*

**Output**

Yes

## Recommended Posts:

- Minimum cuts required to divide the Circle into equal parts
- Count the number of ways to divide an array into three contiguous parts having equal sum
- Check if any square (with one colored cell) can be divided into two equal parts
- Shortest distance between a Line and a Point in a 3-D plane
- Program to check whether 4 points in a 3-D plane are Coplanar
- How to check if two given line segments intersect?
- Check if a line passes through the origin
- Check if a line touches or intersects a circle
- Check if it is possible to draw a straight line with the given direction cosines
- Check if it possible to partition in k subarrays with equal sum
- Check if a large number can be divided into two or more segments of equal sum
- Check whether two strings can be made equal by increasing prefixes
- Mirror of a point through a 3 D plane
- Count of parallelograms in a plane
- Distance between a point and a Plane in 3 D

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.