197552025-12-21 23:11:20LacikaKvHírlánccpp17Időlimit túllépés 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;
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
subtask10/0
1Elfogadva1ms316 KiB
subtask220/20
2Elfogadva2ms508 KiB
3Elfogadva2ms316 KiB
4Elfogadva3ms500 KiB
5Elfogadva4ms316 KiB
6Elfogadva4ms316 KiB
7Elfogadva6ms316 KiB
8Elfogadva6ms332 KiB
9Elfogadva8ms420 KiB
10Elfogadva1ms316 KiB
11Elfogadva2ms316 KiB
12Elfogadva2ms316 KiB
subtask318/18
13Elfogadva180ms1964 KiB
14Elfogadva87ms1956 KiB
15Elfogadva81ms2216 KiB
16Elfogadva79ms2232 KiB
17Elfogadva83ms2868 KiB
18Elfogadva86ms3124 KiB
19Elfogadva83ms3244 KiB
20Elfogadva83ms3244 KiB
21Elfogadva85ms4660 KiB
22Elfogadva87ms5284 KiB
subtask40/42
23Elfogadva1ms316 KiB
24Elfogadva2ms508 KiB
25Elfogadva2ms316 KiB
26Elfogadva3ms500 KiB
27Elfogadva4ms316 KiB
28Elfogadva4ms316 KiB
29Elfogadva6ms316 KiB
30Elfogadva6ms332 KiB
31Elfogadva8ms420 KiB
32Elfogadva1ms316 KiB
33Elfogadva2ms316 KiB
34Elfogadva2ms316 KiB
35Elfogadva180ms1964 KiB
36Elfogadva87ms1956 KiB
37Elfogadva81ms2216 KiB
38Elfogadva79ms2232 KiB
39Elfogadva83ms2868 KiB
40Elfogadva86ms3124 KiB
41Elfogadva83ms3244 KiB
42Elfogadva83ms3244 KiB
43Elfogadva85ms4660 KiB
44Elfogadva87ms5284 KiB
45Időlimit túllépés586ms1960 KiB
46Időlimit túllépés586ms2012 KiB
47Időlimit túllépés586ms2100 KiB
48Időlimit túllépés600ms2216 KiB
49Időlimit túllépés583ms2348 KiB
50Időlimit túllépés583ms2356 KiB
51Időlimit túllépés583ms2476 KiB
52Időlimit túllépés600ms2352 KiB
53Időlimit túllépés572ms2744 KiB
54Időlimit túllépés572ms3004 KiB