FROGV - Editorial

i think it can also be solved using dfs/bfs;

For those who are solving treating frogs as nodes and are imagining an edge between two graphs , if they can communicate ; you need not use matrix or list to store the graph. You can find the different components as follows :

  1. Sort the frogs according to their position on x axis and maintain the indices.
    Then, just use the following thing. :

compo=1;

component[a[0].ind]=1;

for(i=1;i<n;i++)
{
    if(a[i].val-a[i-1].val<=k)
    component[a[i].ind]=compo;
    else
    component[a[i].ind]=++compo;
}

2 frogs can communicate iff they are part of same component. 

Link to the complete solution : CodeChef: Practical coding for everyone

1 Like

Can’t we use DSU to solve this by sorting it.

it can be solved with union-find method too and it’s implementation is very easy…


#include<stdio.h>
 void sort(int b[], int n)
{
   int i,j;
   int temp;
    for(i=1;i<=n-1;i++)
   {
       for(j=1;j<=n-i-1;j++)
       {
           if(b[j]>b[j+1])
           {
               temp = b[j]; 
               b[j] = b[j+1];
               b[j+1] = temp;
           }
   }
}}
int main()
{
    int n,k,p,a[100005],i,frog[2],c1=0,c2=0;
    int n1,n2,b[100005],diff1=0,diff2=0;
    scanf("%d%d%d",&n,&k,&p);
    for(i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
    }
      for(i=1;i<=n;i++)
    {
        b[i] = a[i];
    }
     sort(b,n+1);
      while(p--)
       {
           scanf("%d%d",&n1,&n2);
           if(1<=n1<=n && 1<=n2<=n)
          {
            frog[0] = a[n1];
           frog[1] = a[n2];
           c1 = 1;
           for(i=1;i<=n;i++)
           {
               if(b[i]!=frog[0])
               c1++;
               else break;
           }
           c1 =c1;
           c2 = 1;
           for(i=1;i<=n;i++)
           {
               if(b[i]!=frog[1])
               c2++;
               else break;
           }
           c2 = c2;
           diff1 = c2 - c1;
           diff2 = 0;
           for(i=c1;i<c2;i++)
           {
              if(b[i+1]-b[i]<=k)
                diff2++;
              else break;
           }
           if(diff1==diff2)
            printf("Yes\n");
           else
            printf("No\n");
       }
       }
     }
what is wrong in this code

`` codeblocks giving right answer
every test case is satisfied

It’s simple just calculate the distance between every from…and if it is more than the value of k than the message can not be transferred

It can also be done with the help of DSU data structure.

Hello People,

I have tried this problem almost 3 times with the logic give by @brobear1995 still get WA. Please help me out. Link to the solution.

Can anyone tell me why the algorithm given below gives TLE…?
let all a[i] form the nodes of an undirected graph.
create a c++ set for all unvisited nodes.(initially containing all a[i])
initialize vis[] by all -1
now, call dfs for all nodes having vis[node]==-1
& set vis[node]=caller function to ensure that vis[node] will have same value for all nodes forming a connected component.
In dfs, recur for all nodes currently in unvisited(set) which have abs(a[i]-node)<=k.

Finally, for each query x and y:
if(vis[x]==vis[y])–>yes
else–>no

Can someone help me with this code?

I tried many cases myself and I am getting the desired answer.
But on submission it is showing WA.

Please help.

I know i solved it with more complexity added but i have used the Segment tree . CodeChef: Practical coding for everyone

I did the problem using union find algorithm

11 Likes

Your code gives wrong answer for input:6 3 2
0 3 8 14 12 5
1 1
2 2
answer should be Yes Yes.
And there is no need of printing the answers in the last.You can print them just after solving that particular case. :slight_smile:

In the editorial it is given as ,any two frogs which have same maximum distances can communicate with each other. i am not able to clearly understand this statement.for example let us take this sample test case:

5 1 1

0 1 5 6 8

2 4

the second frog has a max distance of 1,and the fourth frog also has a maximum distance of 1.but they cant communicate with each other …can sumone clarify??

@prem_93 : Maximum distance of communication of frog 2 is 1+1(=k) = 2 , whereas frog 4 has maximum distance of 6+1 = 7 , so they cannot communicate.

@devuy11 …can u plz take the pain of explaining how max distance is calculated??

@prem_93 : There is no pain in explaining :D.Let’s first sort each frog with it’s X-Cordinate.Look closely at the last frog,he can communicate till Last_Frog_Position + K,Now look at the second last frog,If the message sent by the second last frog can reach last frog , then we can assume that the last frog will communicate the message of second last frog without editing :smiley: , otherwise second_last_frog can send it up to second_last_frog position + K . Point to observe is that in calculation of maximum distance of second last frog , only last frog is needed . I hope you can extent it from here.

1 Like

thnks that helped…i actually misunderstood the maximum distance of a specific frog as the maximum distamce itz message can reach…for example in the test case which i have given the fourth frog can transmit itz message over a maximum distance of 1 unit.but the max distance here the editorial specifies the maximum coordinate …right…also my solution with complexity O(nlogn) is giving tle…how should i correct it??prob link: CodeChef: Practical coding for everyone

@prem_93 : right :slight_smile: . Your code seems to be tough one for me to understand :frowning: .

my algorithm is as follows:

  1. used merge sort to sort the x co-ordinates.

2)after sorting, i found the points in which the communication path is disconnected.ie)the x coordinates for which , the distance between them and the next cordinate (in the sorted order) is greater than k.
i stored these values in a new array callect disconnect.

3)now given x and y(nos of the frogs) i calculate their x coordinates and check if there is any value “v” in disconect array satisfying the condition:pos(x)<=v<pos(y)…if yes…then i output “no” and “Yes” if otherwise.