PSHTRG [Unofficial Editorial] (Pishty and Triangles) MARCH LONG

For a list of sides to not form a valid triangle, the side length must be such that when the sides are sorted, every element is atleast the sum of previous two elements. In the worst case, the values may be of the form:
1, 2, 3, 5, 8, 13, 21, and so on…
This is nothing but the Fibonacci Series. In this series, the 44th number is 1134903170 which is greater than 109. This is an important conclusion as this means that if a node contains NO valid triangle, than it will AT MAX hold Just 43 values
Thus, any node in the segment tree will hold at max 45 values where the sides are of the form:
1,1,1,2,3,5,8,13… and so on till 701408733
@awesome conclusion @harshmmodi bhaiya thanks for editorial

1 Like

Anybody tell me why its showing WA for this solution:link text

Runtime can be further improved by the fact that you dont have to create a tmp array, directly do the idea of merge sort tree in reverse.

U need max 45 values out of 90 values, right.

U merge the nodes such that elements in a node are stored in decreasing order, because it will save the time to create tmp array first. Also, do the work of 2nd loop inside and as soon as u find a triangle, or run out of lists, break the loop.

Another thing, Minimum value of K is 40, since 40th term of fibonacci series exceed 1e9.

Btw, nice detailed editorial…

Anybody plz tell me why i am getting TLE for this solution : link text

Heyy… Can anyone provide the editorial for the problem Chef And GCD queries(GCDCNT). I tried to solve the problem and my complexity for each query was around O(2^6 log(n)) but still it gave TLE. Here is the link to my soln.

Nice Editorial. For similar problems, check out yandex problem D(the last round ie (waitt… last or the second last… i forgot XD)). Also, Polish informatics Olympiad’s problem : triangles and triangles2

1 Like

My solution: CodeChef: Practical coding for everyone

I have used square root decomposition. Each segment is sorted using TreeSet for logarithmic time complexity.Each query in √n log n time using heap.

2 Likes

thanks, @harshmmodi Now I understand the reason behind the value of K = 45 or 50 in the official editorial.

My solution

I used iterative segment tree as described here. Very efficient and easy to implement/debug/personalise.

1 Like

@doramon u r getting wrong because of the size of temporary array which is b[60] set the size to 90 because u can have 45 +45 from the fibonacci series
But suprisingly the last test case is timing out

Link:CodeChef: Practical coding for everyone

Happy to hear that it helped :slight_smile:

@doramon change all those 30’s to 50’s , 29’s to 49’s and 60’s to 100’s and run… it may work then

Yes, you are completely correct that the temp array is not required. I included it just so that its easier for others to understand. (But, should’ve mentioned that it’s not necessary :’) )

And as far as that 40th number is concerned, I think there’s some confusion. 40th number is 102334155 which is less than 1e9.

Oh… Miscounted digits…

I guess i miscounted digits of 40th fib number :stuck_out_tongue:

TCs didnt include a failing test case, because my soln passed with 40.

In every node of the tree, you are storing all the elements in its span. This is giving TLE. Store only those elements which form the largest valid triangle and those greater than these sides. You may read the Approach for building the segment tree written above

Happy to hear that :slight_smile:

Can you please explain your solution. What are you storing in bucket of n^(1/2) and how are u handling the queries.

For query, I have used a PriorityQueue (Heap). In this heap, I have inserted the max value from each bucket (and their bucket index). Complexity: √(N).log N

Now, the tricky part. I have 'poll’ed the maximum value from the heap and inserted the next largest value in that bucket

Suppose the heap contains [9,5,4]. 9 is polled. The next largest value from the bucket containing the ‘9’ is added to the heap, say 3. So, the heap becomes [5,4,3]. Again 5 is polled and so on…

The last tricky part: handling multiple occurrence of the same value.
For this, TreeMap is used all over instead of TreeSet

Each bucket is just a frequency record, containing the frequency of each value in that segment.

TreeMap is used for that purpose.

thank you sir for the editorial :slight_smile: please keep posting such awesome contents for us to learn :slight_smile: