197682025-12-22 13:26:18LacikaKvHírlánccpp17Időlimit túllépés 38/80600ms8244 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 (diak *e, int len, diak *a, bool *szamolt, int pos, int *ringpos)
{
   if (a[pos].maxhossz) {
//      cout << endl;
      return a[pos].maxhossz;
   }
   if (szamolt[pos]) {
      *ringpos = pos;
   } else {
      szamolt[pos] = true;
//      cout << pos << "->" << a[pos].maxhossz << ", ";
      a[pos].maxhossz = lanchossz (e, len, a, szamolt, a[pos].tovaad,ringpos) + 1;
      if (e->maxhossz < a[pos].maxhossz) {
         e->maxhossz = a[pos].maxhossz;
         e->tovaad = pos;
      }
//      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()
{
   diak eredm;
   int N;
   std::ios_base::sync_with_stdio (false); // Supposedly makes I/O faster
   /**/
   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];
   eredm.tovaad = 0;
   eredm.maxhossz = 0;
   int ringpos = 0;
//   KiirDiak(a, N);
   for (int i=1; i<=N; i++) {
      if (a[i].maxhossz == 0) {
//         cout << endl << "Elem:" << i << endl;
         ResetSzamolas(szamolt,N);
         lanchossz(&eredm, N+1, a, szamolt, i,&ringpos);
         MaximizeLoop(a, ringpos, a[ringpos].tovaad, a[ringpos].maxhossz);
//         KiirDiak(a, N+1);
//         cout << endl;
      }
   }
   cout<<eredm.tovaad<<" "<<eredm.maxhossz<<endl;
   return 0;
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
subtask10/0
1Elfogadva1ms316 KiB
subtask220/20
2Elfogadva2ms316 KiB
3Elfogadva2ms500 KiB
4Elfogadva2ms316 KiB
5Elfogadva2ms552 KiB
6Elfogadva1ms316 KiB
7Elfogadva1ms316 KiB
8Elfogadva2ms316 KiB
9Elfogadva3ms508 KiB
10Elfogadva1ms356 KiB
11Elfogadva1ms316 KiB
12Elfogadva1ms432 KiB
subtask318/18
13Elfogadva92ms2172 KiB
14Elfogadva41ms1988 KiB
15Elfogadva39ms2360 KiB
16Elfogadva41ms2508 KiB
17Elfogadva43ms3892 KiB
18Elfogadva43ms4148 KiB
19Elfogadva43ms4148 KiB
20Elfogadva45ms4148 KiB
21Elfogadva48ms7220 KiB
22Elfogadva46ms8244 KiB
subtask40/42
23Elfogadva1ms316 KiB
24Elfogadva2ms316 KiB
25Elfogadva2ms500 KiB
26Elfogadva2ms316 KiB
27Elfogadva2ms552 KiB
28Elfogadva1ms316 KiB
29Elfogadva1ms316 KiB
30Elfogadva2ms316 KiB
31Elfogadva3ms508 KiB
32Elfogadva1ms356 KiB
33Elfogadva1ms316 KiB
34Elfogadva1ms432 KiB
35Elfogadva92ms2172 KiB
36Elfogadva41ms1988 KiB
37Elfogadva39ms2360 KiB
38Elfogadva41ms2508 KiB
39Elfogadva43ms3892 KiB
40Elfogadva43ms4148 KiB
41Elfogadva43ms4148 KiB
42Elfogadva45ms4148 KiB
43Elfogadva48ms7220 KiB
44Elfogadva46ms8244 KiB
45Időlimit túllépés578ms2180 KiB
46Időlimit túllépés507ms2192 KiB
47Időlimit túllépés544ms2096 KiB
48Időlimit túllépés518ms2100 KiB
49Időlimit túllépés587ms2612 KiB
50Időlimit túllépés586ms2868 KiB
51Időlimit túllépés583ms2868 KiB
52Időlimit túllépés600ms3008 KiB
53Időlimit túllépés588ms3636 KiB
54Időlimit túllépés592ms4148 KiB