Advertisement
a53

proeminenta

a53
May 5th, 2022
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.20 KB | None | 0 0
  1. #include <fstream>
  2. using namespace std;
  3. #define NMax 1000005
  4. long long int N,C,s,a[NMax];
  5.  
  6. long long int min(long long int i,long long int j)
  7. {
  8. if(i<j)
  9. return i;
  10. return j;
  11. }
  12.  
  13. long long int peak[NMax],valley[NMax],top=-1; /// peak este stiva de varfuri
  14. /// valley retine cele mai adanci vai
  15. long long int prom[2][NMax]; /// proeminenta la stanga varfului de pe pozita i este prom[0][i]
  16. /// si la dreapta este prom[0][n-1-i] datorita oglindirii
  17.  
  18. void popTop()
  19. { /// eliminam un varf din stiva, actualizam cea mai adanca vale din dreapta daca e cazul
  20. if(top<0)
  21. return;
  22. if(top>=1&&valley[top-1]>valley[top])
  23. valley[top-1]=valley[top];
  24. --top;
  25. }
  26.  
  27. int main()
  28. {
  29. ifstream f("proeminenta.in");
  30. ofstream g("proeminenta.out");
  31. f>>C>>N;
  32. for(int i=0;i<N;++i)
  33. {
  34. f>>a[i];
  35. if(i>0&&a[i]==a[i-1])
  36. --i,--N; /// eliminam duplicatele
  37. }
  38. if(C==1)
  39. {
  40. for(int i=1;i<N-1;++i)
  41. if(a[i-1]<a[i]&&a[i]>a[i+1])
  42. ++s; /// este varf
  43. g<<s<<'\n';
  44. return 0;
  45. }
  46. for(int d=0;d<=1;++d)
  47. { /// d=0 va fi parcurgerea stanga-dreapta,si d=1
  48. /// dupa oglindire,adica dreapta -stanga
  49. for(int i=1;i<N-1;++i)
  50. {
  51. if(a[i-1]<a[i]&&a[i]>a[i+1]) { // este varf
  52. prom[d][i]=a[i];
  53. while(top>=0&&a[peak[top]]<=a[i]) /// elimin varfurile mai mici din stiva pe rand
  54. popTop();
  55. if(top>=0&&a[peak[top]]>a[i])
  56. prom[d][i]=a[i]-valley[top]; /// am gasit primul varf mai mare din stanga
  57. peak[++top]=i;
  58. valley[top]=a[i]; /// adaugam noul varf
  59. }
  60. if(top>=0&&valley[top]>a[i])
  61. valley[top]=a[i];
  62. }
  63. for(int i=0;i<N/2;++i) /// oglindim altitudinile
  64. swap(a[i],a[N-1-i]);
  65. top=-1;
  66. }
  67. for(int i=1;i<N-1;++i)
  68. if(a[i-1]<a[i]&&a[i]>a[i+1])
  69. if(prom[0][i]>prom[1][N-1-i]) /// retinem maximul in prom[0][i]
  70. prom[0][i]=prom[1][N-1-i];
  71. for(int i=1;i<N-1;++i)
  72. if(prom[0][i]>0)
  73. g<<prom[0][i]<<' '; /// si il afisam
  74. g<<'\n';
  75. return 0;
  76. }
  77.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement