197552025-12-21 23:11:20LacikaKvHírlánccpp17Time limit exceeded 38/80600ms5284 KiB
#include <iostream>
#include <cstring>

using namespace std;
struct diak
{
    int tovaad;
    int maxhossz=0;
};

void KiirDiak(diak *a, int len)
{
   cout << endl;
   for (int i=1; i<len; i++) {
      cout << "{"<< a[i].tovaad <<", "<< a[i].maxhossz << "}";
      if (i<len)
         cout << ", ";
   }
   cout << endl;
}

void ResetSzamolas(bool *szamolt, int len) {
   memset(szamolt,0,(len+1)*sizeof(bool));
}

void MaximizeLoop(diak *a, int epos, int pos, int maxhossz)
{
   if (epos != pos) {
      a[pos].maxhossz = maxhossz;
      MaximizeLoop(a,epos,a[pos].tovaad,maxhossz);
   }
}


bool IsLoopStartPos(int len, diak* a, bool *szamolt, int pos)
{  int cpos = pos;
   do {
      szamolt[cpos] = true;
      cpos = a[cpos].tovaad;
   } while (!szamolt[cpos]);
   return (cpos == pos);
}

void EqualizeLoop(int len, diak* a, bool *szamolt, int spos)
{  if (IsLoopStartPos(len, a, szamolt,spos)) {
//      cout << "Kor:" << spos << endl;
      MaximizeLoop(a, spos, a[spos].tovaad, a[spos].maxhossz);
   } else {
      ResetSzamolas(szamolt,len);
//      cout << "Lepjel:" << a[spos].tovaad << endl;
      EqualizeLoop(len, a, szamolt, a[spos].tovaad);
   }
}

int lanchossz (int len, diak *a, bool *szamolt, int pos)
{
   if (a[pos].maxhossz) {
//      cout << endl;
      return a[pos].maxhossz;
   }
   if (!szamolt[pos]) {
      szamolt[pos] = true;
//      cout << pos << "->" << a[pos].maxhossz << ", ";
      a[pos].maxhossz = lanchossz (len, a, szamolt, a[pos].tovaad) + 1;
//      cout << pos << "->" << a[pos].maxhossz << ", ";
   }
   return a[pos].maxhossz;
}
void hirmax (diak *a, int len)
{  int i,pos,maxh=0;
   for (i=1; i<len; i++) {
      if (a[i].maxhossz>maxh) {
         maxh=a[i].maxhossz;
         pos=i;
      }
   }
   cout<<pos<<" "<<maxh<<endl;
}

int main()
{
   int N;
   /**/
   cin>>N;
   diak a[N+1];
   for (int i=1; i<=N; i++)
   {
     cin>>a[i].tovaad;
   }
   /*/
   N = 11;
   diak a[N+1] = { {0,0}, {3,0}, {1,0}, {2,0}, {3,0}, {2,0}, {5,0}, {6,0}, {5,0}, {10,0}, {11,0}, {10,0} };
   /**/
   bool szamolt[N+1];

//   KiirDiak(a, N);
   for (int i=1; i<=N; i++) {
      if (a[i].maxhossz == 0) {
//         cout << endl << "Elem:" << i << endl;
         ResetSzamolas(szamolt,N);
         lanchossz(N+1, a, szamolt, i);
         ResetSzamolas(szamolt,N);
//         cout << endl;
         EqualizeLoop(N+1, a, szamolt, i);
//         KiirDiak(a, N+1);
//         cout << endl;
      }
   }
   hirmax(a,N+1);
   return 0;
}
SubtaskSumTestVerdictTimeMemory
subtask10/0
1Accepted1ms316 KiB
subtask220/20
2Accepted2ms508 KiB
3Accepted2ms316 KiB
4Accepted3ms500 KiB
5Accepted4ms316 KiB
6Accepted4ms316 KiB
7Accepted6ms316 KiB
8Accepted6ms332 KiB
9Accepted8ms420 KiB
10Accepted1ms316 KiB
11Accepted2ms316 KiB
12Accepted2ms316 KiB
subtask318/18
13Accepted180ms1964 KiB
14Accepted87ms1956 KiB
15Accepted81ms2216 KiB
16Accepted79ms2232 KiB
17Accepted83ms2868 KiB
18Accepted86ms3124 KiB
19Accepted83ms3244 KiB
20Accepted83ms3244 KiB
21Accepted85ms4660 KiB
22Accepted87ms5284 KiB
subtask40/42
23Accepted1ms316 KiB
24Accepted2ms508 KiB
25Accepted2ms316 KiB
26Accepted3ms500 KiB
27Accepted4ms316 KiB
28Accepted4ms316 KiB
29Accepted6ms316 KiB
30Accepted6ms332 KiB
31Accepted8ms420 KiB
32Accepted1ms316 KiB
33Accepted2ms316 KiB
34Accepted2ms316 KiB
35Accepted180ms1964 KiB
36Accepted87ms1956 KiB
37Accepted81ms2216 KiB
38Accepted79ms2232 KiB
39Accepted83ms2868 KiB
40Accepted86ms3124 KiB
41Accepted83ms3244 KiB
42Accepted83ms3244 KiB
43Accepted85ms4660 KiB
44Accepted87ms5284 KiB
45Time limit exceeded586ms1960 KiB
46Time limit exceeded586ms2012 KiB
47Time limit exceeded586ms2100 KiB
48Time limit exceeded600ms2216 KiB
49Time limit exceeded583ms2348 KiB
50Time limit exceeded583ms2356 KiB
51Time limit exceeded583ms2476 KiB
52Time limit exceeded600ms2352 KiB
53Time limit exceeded572ms2744 KiB
54Time limit exceeded572ms3004 KiB