RRSUM - editorial

PROBLEM LINK:

Practice
Contest

Author: Roman Rubanenko
Tester: Shiplu Hawlader
Editorialist: Praveen Dhinwa

DIFFICULTY:

Medium

PREREQUISITES:

Simple Math.

PROBLEM:

Given N.
Let A = {1, 2, , N} and B = {N + 1, , 2 * N}.
Let C contains elements representing sum of pairs of A and B. Note that C is a multiset.
You will be given queries in which you are asked to find cnt of q in C.

Explanation

Note that entries in C will be between N + 2 to 3N.

Given a q, how to find cnt of q in C?

Let us say that number selected from A is x and from B is y.
So x + y = q.
Rewrite as x = q - y.

We see that y should satisfy following inequalities.
N + 1 <= y <= 2N i.e. 1 <= q - y <= N.

You can see that count of valid y will be answer of our problem.

Can you get value of count of valid y from the above inequalities?

Yes, Rewrite both the inequalities as follows.
1 <= q - y <= N will become q - N <= y <= q - 1.
N + 1 <= y <= 2N

So we notice that y should be at least max(q - N, N + 1) and at most min(q - 1, 2N).

Now, can you find count of valid y’s?

Yes, if y lies in the range [L, R], then answer will be R - L + 1.
Note that if L > R, then there is no solution.

Pseudo Code


	long L = max(q - N, N + 1);
	long R = min(q - 1, 2N);
	long long ans = 0;
	if (L > R)
		ans = 0;
	else 
		ans = R - L + 1;

Few Small Points

  • Note that q can overflow from long data type because q can go upto 3 * 10^9. You should use long long data type.

Complexity:
For each query, we are just doing a constant number of operations. So for each test case, if there are queries, our time complexity
will be O(m) per test case.

AUTHOR’S and TESTER’S SOLUTIONS:

Author’s solution
Tester’s solution

6 Likes

please swap the PROBLEM LINK with that of “RRCOPY - editorial”

From the editorial,

We see that x should satisfy following inequalities.
1 <= y <= N i.e. 1 <= q - x <= N.
N + 1 <= x <= 2N

Looks like there is some typo here.
x is from set A and should satisfy the criteria 1 <= x <= N
y is from set B and should satisfy the criteria N+1 <= y <= 2N

Editorialist, can you please confirm?

1 Like

Loved the problem and editorial.
It would be great if you can point me to more such inequality based problems!

Thanks

LonoCoder

I fail to understand how come the number of count equals to be R-L+1?

2 Likes

Yes, Rewrite both the inequalities as follows.

1 <= q - y <= N will become q - N <= y <= q - 1.

N + 1 <= y <= 2N

So we notice that y should be at least max(q - N, N + 1) and at most min(q - 1, 2N).

I don’t understand the 2nd line. How does left becomes right? Could you explain more precise?

And how can “So we notice that y should be at least max(q - N, N + 1) and at most min(q - 1, 2N)” be correct?
I don’t notice anything. I notice only that why can’t L be q-N or N+1 why must it be max of the two value.


Here’s my code, it came from observation look longer but I also like your methodology. But I don’t understand your way of thinking yet. It looks useful though.

if (q < 1+n+1 || q > n+n*2) ans = 0; // all formulas came from taking examples on paper

else if (n+1 <= q-n && q-n <= n2) ans = n2 - (q-n) + 1;

else ans = q-(n+1);

1 Like

My solution to this problem. Tell me how is it.
#include<bits/stdc++.h>
#include
using namespace std;

int main()
{
long long int n,m;
scanf("%lld%lld",&n,&m);
long long int ans=0,median;

median=1+(2*n);
while(m--)
{
    long long int x;
    scanf("%lld",&x);
    ans=n-abs(median-x);
    if(ans<0)
    {
        ans=0;
    }
    printf("%lld\n",ans);
}
return 0;

}

Really nice problem - I can’t vote yet so expressing my gratitude over the comments. Thank You!

1 Like

I took a little different approach,

long long int answer = min( q-n-2, 3*n-q ) + 1;

This can easily seen once you observe that the frequency first increases and then decreases again.

Here’s how I did it:

n, queries = map(int, input().split(' '))

for _ in range(queries):
    query = int(input())

    if query < (n + 1) + 1:
        print(0)

    elif query > n + 2*n:
        print(0)

    else:
        print(n - abs((n + (n + 1)) - query))
2 Likes

hey… here Clicking on the practice link… it redirects to RRCOPY problem instead of RRSUM. u should correctly redirect to RRSUM problem only

corrected, Actually if validity of x implied validity of y and vice versa. This is why the analysis will be go exactly the same.

Hey Please tell me how can overflow occur in this question ,as acc to question ,n <=10^9
and maximum computation required is 3n ,which would yield 310^9 and it can be stored in int,right??

Observation is the key.

Heres how I did it!!!
Its just simple math dont go with the content
Time- O(M)
#include <bits/stdc++.h>
using namespace std;

int main() {
//code
long long int N,M,V,D,Z,K;
cin>>N>>M;
while(M–){
cin>>V;
D=2N+1;
Z=D-V;
if(Z<0){
Z=Z
(-1);
}
if(Z<N){
K=N-Z;
}else{
K=0;
}cout<<K<<endl;
}
return 0;
}