CSES-Two Sets (solution + explanation)
CSES āĻāϰ āĻā§āĻŦāĻ āĻŽāĻāĻžāϰ āĻāĻāĻāĻž āĻĒā§āϰāĻŦāϞā§āĻŽ āĻšāϞā§āĻž Two Sets āĻĒā§āϰāĻŦāϞā§āĻŽ. āĻāĻāĻā§ āĻŽāĻžāĻĨāĻž āĻāĻžāĻāĻžāϞā§āĻ āĻāϰ āϏāĻŽāĻžāϧāĻžāύ āĻĒāĻžāĻā§āĻž āϝāĻžā§āĨ¤ āϤā§āĻž āĻāϏā§āύ white paper āύāĻŋā§ā§ āĻŦāϏāĻž āϝāĻžāĻ...
Problem: Time limit: 1.00 s | Memory limit: 512 MB
Your task is to divide the numbers 1,2,âĻ,n into two sets of equal sum. Input The only input line contains an integer n. Output Print "YES", if the division is possible, and "NO" otherwise. After this, if the division is possible, print an example of how to create the sets. First, print the number of elements in the first set followed by the elements themselves in a separate line, and then, print the second set in a similar way. Constraints
1â¤nâ¤106
Example 1 Input: 7 Output: YES 4 1 2 4 7 3 3 5 6 Example 2 Input: 6 Output: NO
Problem Explanation:
āĻŽā§āĻāύ āĻāĻĨāĻž āĻšāϞā§āĻž āĻāĻāĻāĻž āϏāĻāĻā§āϝāĻž n ā§āĻĻāĻā§āĻž āĻĨāĻžāĻāĻŦā§ āĻāĻŦāĻ āĻāĻŽāĻžāĻĻā§āϰ āĻāĻžāĻ āĻšāĻŦā§ 1 āĻĨā§āĻā§ āĻ āϏāĻāĻā§āϝāĻž(n) āĻĒāϰā§āϝāύā§āϤ āϝāϤ āϏāĻāĻā§āϝāĻž āĻāĻā§ āϤāĻžāĻĻā§āϰ 2 āĻāĻžāĻā§ āĻāĻžāĻ āĻāϰāĻž āϝāĻžāϤ⧠āĻāĻā§ āĻāĻžāĻā§āϰ āϝā§āĻžāĻāĻĢāϞ āϏāĻŽāĻžāύ āĻšā§āĨ¤ āϝāĻĻāĻŋ āĻāĻŽāύ āĻā§āĻžāύā§āĻž āĻāĻžāĻ āϤā§āϰāĻŋ āĻāϰāĻž āύāĻž āϝāĻžā§ āϤāĻžāĻšāϞ⧠"NO" āĻĒā§āϰāĻŋāύā§āĻ āĻāϰāϤ⧠āĻšāĻŦā§(example 2)āĨ¤ āĻāϰ āĻāϤā§āϤāϰ āĻĨāĻžāĻāϞ⧠"YES" āĻĒā§āϰāĻŋāύā§āĻ āĻāϰ⧠āĻāĻžāĻ āĻĻā§āĻāĻŋ āϤāĻžāĻĻā§āϰ āĻĒāϰāĻŋāĻŽāĻžāύ āϏāĻš āĻĒā§āϰāĻŋāύā§āĻ āĻāϰāϤ⧠āĻšāĻŦā§(example 1)āĨ¤
Solution Explanation:
āĻŦāĻšā§ āĻŦāĻāϰā§āϰ āĻāĻŦā§āώāĻŖāĻžāϰ āĻĒāϰ āĻŦā§āĻžāĻāĻž āĻā§āϞ āϝ⧠āĻāĻāĻžāύ⧠āĻāĻāĻāĻž āĻĒā§āĻāĻžāϰā§āύ āĻāĻā§ āϝāĻžāϰ āĻŽāĻžāϧā§āϝāĻŽā§ āϏāĻšāĻā§āĻ āĻāĻāĻž āϏāĻŽāĻžāϧāĻžāύ āĻāϰāĻž āϝāĻžā§ (āĻāϰā§āĻž āϏāĻšāĻ āϏāĻŽāĻžāϧāĻžāύ āĻĨāĻžāĻāϤā§āĻ āĻĒāĻžāϰā§, āĻĨāĻžāĻāĻžāĻāĻžāĻ āϏāĻžāĻāĻžāĻŦāĻŋāĻāĨ¤ āĻāĻŋāύā§āϤ⧠āĻāĻāĻžāϰ āĻāĻāĻĄāĻŋā§āĻž āĻĒāĻžāĻŦāĻžāϰ āĻĒāϰ āĻ āύā§āϝāĻāĻŋāĻā§ āĻāϰ āĻāĻžāĻŦāĻž āĻšā§āύāĻŋ)āĨ¤ āĻĒā§āϝāĻžāĻāĻžāϰā§āύāĻāĻžāĻā§ āĻāĻŽāĻŋ snake pattern āĻŦāϞāĻŋ āĻāĻžāϰāύ āĻāĻāĻžāύ⧠āϏāĻāĻā§āϝāĻž āĻā§āϞā§āĻžāĻā§ āϏāĻžāĻĒā§āϰ āĻŽāϤā§āĻž āĻāϰ⧠āϏāĻžāĻāĻžāύā§āĻž āĻšā§āĨ¤
āϝāĻĻāĻŋ n = 8 āĻšā§ āϤāĻŦā§ āĻāĻŽāϰāĻž āĻāĻā§ āϏāĻžāĻāĻžāĻŦā§āĻž āĻāĻāĻžāĻŦā§, 8 5 -> 4 1 | | | | 7 -> 6 3 -> 2
āĻāĻāĻžāύ⧠āĻšāĻŋāϏāĻžāĻŦā§āϰ āϏā§āĻŦāĻŋāϧāϰā§āϤ⧠vector 1 = 8, 5, 4, 1 āĻāĻŦāĻ vector 2 = 7, 6, 3, 2 āϧāϰāϤ⧠āĻĒāĻžāϰāĻŋāĨ¤ snake pattern āĻ āĻāĻŋāĻā§ āĻŽāĻāĻžāϰ āĻŦā§āĻļāĻŋāώā§āĻ āĻāĻā§āĨ¤ āϝā§āĻŽāύ, āĻĒā§āϰāϤā§āϝā§āĻāĻŦāĻžāϰ decrement 3 āĻŦāĻž 1 āĻāϰ⧠āĻšā§ā§āĻā§, vector 1 āϏāϰā§āĻŦāĻā§āĻ āϏāĻāĻā§āϝāĻž āĻĨā§āĻā§ vector 2 āĻĻā§āĻŦāĻŋāϤā§ā§ āϏāϰā§āĻŦāĻā§āĻ āϏāĻāĻā§āϝāĻž āĻĨā§āĻā§ āĻļāϰ⧠āĻšā§ā§āĻā§āĨ¤ āĻāĻā§ā§āϰāĻ āϏāϰā§āĻŦāύāĻŋāĻŽā§āύ āϏāĻāĻā§āϝāĻž ā§Ļ āĻĨā§āĻā§ āĻŦā§āĨ¤ āĻāĻ āĻŦā§āĻļāĻŋāώā§āĻ āĻā§āϞā§āĻž āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āϏāĻšāĻā§āĻ vector 1 āĻāĻŦāĻ vector 2 āĻāĻ āύ āĻāϰāĻž āϝāĻžāĻŦā§āĨ¤
āĻāϰāĻĒāϰ āĻĻā§āĻāĻŦ āĻāĻĻā§āϰ āϝā§āĻžāĻāĻĢāϞā§āϰ āĻĒāĻžāϰā§āĻĨāĻā§āϝ āĻāϤāĨ¤ āĻĒāĻžāϰā§āĻĨāĻā§āϝ = ā§Ļ āĻšāϞ⧠vector 1 āĻāĻŦāĻ vector 2 āϏāĻŽāĻžāύāĨ¤ āĻāϤā§āϤāϰ "YES"āĨ¤ āĻĒāĻžāϰā§āĻĨāĻā§āϝ = 1 āĻšāϞ⧠vector 1 āĻāĻŦāĻ vector 2 āĻā§ āĻāĻāύā§āĻž āϏāĻŽāĻžāύ āĻāϰāĻž āϝāĻžāĻŦā§ āύāĻž āĻāĻžāϰāύ āĻ āϤāĻŋāϰāĻŋāĻā§āϤ 1 āϝ⧠vectorāϰā§āĻ āĻĻā§ā§āĻž āĻšā§āĻžāĻāύāĻž āĻā§āύ āϤāĻžāϰ āĻŽāĻžāύ āĻāĻĒāϰāĻāĻŋāϰ āĻĨā§āĻā§ āĻŦā§āϰ⧠āϝāĻžāĻŦā§āĻāĨ¤ āϏā§āϤāϰāĻžāĻ āĻāϤā§āϤāϰ "NO"āĨ¤ āĻĒāĻžāϰā§āĻĨāĻā§āϝ = ⧍ āĻšāϞ⧠āĻŦā§ vector āĻĨā§āĻā§ 1 āĻā§āĻā§ āĻā§āĻžāĻ vector a āϰāĻžāĻāϞā§āĻ āĻĻā§āĻāĻŋ āϏāĻŽāĻžāύ āĻšā§ā§ āϝāĻžāĻŦā§(āĻāĻā§āώā§āϤā§āϰ⧠āĻāĻŽāĻŋ vector 1 āĻāĻŦāĻ vector 2 āĻāϰ āĻŽāĻžāĻā§ element swap āĻāϰā§āĻāĻŋ)āĨ¤ āĻāϤā§āϤāϰ "YES"āĨ¤
snake pattern āĻ āĻāĻ ā§ŠāĻāĻŋ āĻāĻāύāĻžāĻ āĻāĻāϤ⧠āĻĒāĻžāϰ⧠āϝāĻžāϰ āĻŽāĻžāϧā§āϝāĻŽā§ āĻāĻžāĻā§āĻāĻŋāϤ āϏā§āĻ āĻĻā§āĻāĻŋ āĻāĻžāĻ āĻĒāĻžāĻā§āĻž āϝāĻžāĻŦā§āĨ¤
code: click here for -> Code link<-
#include <vector> #include <iostream> #include <algorithm> #include <numeric> #define ll signed long long int void print_vec(std::vector <ll> v1, std::vector <ll> v2) { // printing result if available // part 1 (vector v1) printf("YES\n%lld\n", (ll)v1.size()); for (ll i = 0; i < v1.size();i ++) { printf("%lld ", v1[i]); } // part 2 (vector v2) printf("\n%lld\n", (ll)v2.size()); for (ll i = 0; i < v2.size(); i ++) { printf("%lld ", v2[i]); } } int main(void) { ll n = 0; scanf("%lld", &n); // v1 = v2 = store snake pattern values std::vector <ll> v1, v2; // process // creating vectors int v1s = 1, v2s = 3; for (ll v1i = n, v2i = n - 1; v1i > 0 || v2i > 0; v1i -= v1s, v2i -= v2s) { // decrement 3, decrement 1, decrement 3, decrement 1........... if (v1i > 0) { v1.push_back(v1i); (v1s == 1)? v1s = 3 : v1s = 1; } if (v2i > 0) { v2.push_back(v2i); (v2s == 1)? v2s = 3 : v2s = 1; } } //end creating vectors //storing sum of 2 vectors ll v1sum = std::accumulate(v1.begin(), v1.end(), 0); ll v2sum = std::accumulate(v2.begin(), v2.end(), 0); // if difference of 2 sum is 1 then print NO if (abs(v1sum - v2sum) == 1) { printf("NO"); } // if difference of 2 sum is 0 then this 2 vector is already equal. just print them else if (v1sum - v2sum == 0) { // print_vec will print this 2 vectors according output needs print_vec(v1, v2); } // if difference is 2 then we can swap value to resize and make equal else if (abs(v1sum - v2sum) == 2) { // if sum of vector 1 > vector 2 then we can simply swap 1st values of both them // cause 1st value is greater in vector 1(snake pattern). this way we can make equal if (v1sum > v2sum) { std::swap(v1[0], v2[0]); } // 2nd value is greater in vector 2 (snake pattern) else { std::swap(v1[1], v2[1]); } // after swap it is now equal. so print it print_vec(v1, v2); } else printf("NO"); return 0; }














