fork download
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. int main()
  5. {
  6. int t,a[5000],n;
  7.  
  8. cin >> t;
  9. while(t--)
  10. {
  11. cin >> n;
  12. //int a[n];
  13. unordered_map<int, int> mp;
  14. for(int i=0;i<n;i++)
  15. {
  16. cin >> a[i];
  17. mp[a[i]] = i; // dodajemy element a[i] do hashmapy z indeksem i
  18. }
  19. if(n <= 2) // jeśli ciąg ma mniej niż 3 elementy, to jest to ciąg arytmetyczny o długości 1 lub 2
  20. {
  21. cout << n << endl;
  22. }
  23. else
  24. {
  25. int ans = 1; // długość najdłuższego ciągu arytmetycznego
  26. for(int i=0;i<n-1;i++)
  27. {
  28. for(int j=i+1;j<n;j++) // szukamy ciągu arytmetycznego kończącego się na j i zaczynającego się na i
  29. {
  30. int d = a[j] - a[i]; // różnica między a[j] i a[i]
  31. int cnt = 2; // długość ciągu arytmetycznego
  32. int next = a[j] + d; // następny element ciągu
  33. while(mp.find(next) != mp.end() && mp[next] > j) // szukamy kolejnych elementów ciągu arytmetycznego
  34. {
  35. cnt++; // zwiększamy długość ciągu o 1
  36. j = mp[next]; // uaktualniamy j na indeks kolejnego elementu ciągu
  37. next += d; // u
  38. }
  39. ans = max(ans, cnt); // aktualizujemy długość najdłuższego ciągu arytmetycznego
  40. }
  41. }
  42. cout << ans << endl; // wypisujemy wynik dla danego zestawu danych
  43. }
  44. }
  45. return 0;
  46. }
Success #stdin #stdout 0.01s 5460KB
stdin
6
4
4 4 4 4
7
2 1 3 5 4 6 5
4
1 2 5 3
9
1 0 7 9 12 13 14 15 19
9
1 0 7 9 12 13 14 15 19
3
1 2 5
stdout
3
4
3
4
4
2