Advertisement
a53

copaci1

a53
Jul 4th, 2020
164
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.61 KB | None | 0 0
  1. #include <algorithm>
  2. #include <cstdio>
  3. #include <cstring>
  4. using namespace std;
  5. #define maxn 200010
  6. #define valmax 210
  7. int N, sol;
  8. int ST[maxn], DR[maxn], H[maxn];
  9. int val[valmax];
  10.  
  11. /** functii calc_st() si calc_dr() se pot implementa eficient folosind o stiva **/
  12. void calc_st()
  13. {
  14. memset(val, 0, sizeof(val));
  15. int i, j, p;
  16.  
  17. for(i=1; i<=N; i++) {
  18. p = 0;
  19. for(j=H[i]; j<valmax; j++) {
  20. p = max(p, val[j]);
  21. }
  22.  
  23. ST[i] = p;
  24. val[ H[i] ] = i;
  25. }
  26. }
  27.  
  28. void calc_dr()
  29. {
  30. memset(val, 0, sizeof(val));
  31. int i, j, p;
  32.  
  33. for(i=N; i>=1; i--) {
  34. p = N+1;
  35. for(j=H[i]; j<valmax; j++) {
  36. if(val[j]) p = min(p, val[j]);
  37. }
  38.  
  39. DR[i] = p;
  40. val[ H[i] ] = i;
  41. }
  42. }
  43.  
  44. int main()
  45. {
  46. FILE *f1=fopen("copaci1.in", "r"), *f2=fopen("copaci1.out", "w");
  47. int i, j, p, q;
  48.  
  49. fscanf(f1, "%d\n", &N);
  50. for(i=1; i<=N; i++) {
  51. fscanf(f1, "%d", &H[i]);
  52. }
  53. calc_st();
  54. calc_dr();
  55.  
  56. for(i=2; i<=N-1; i++) {
  57. //consideram copacul i ca fiind de inaltime minima din triunghiul (A, i, B)
  58. //poate exista cel mult un triunghi centrat in i
  59. p = ST[i], q = DR[i];
  60. if(p == 0 || q == N+1) continue;
  61.  
  62. //trebuie sa verificam daca p vede pe i, daca q vede pe i
  63. //si daca p si q se vad reciproc
  64. if(ST[i] <= p && DR[i] >= q && DR[p] >= q && ST[q] <= p) {
  65. sol ++;
  66. }
  67. }
  68. fprintf(f2, "%d\n", sol);
  69. fclose(f1); fclose(f2);
  70. return 0;
  71. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement