Advertisement
a53

minisecvente_of

a53
Apr 4th, 2019
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.32 KB | None | 0 0
  1. #include <fstream>
  2. #define NMAX 100002
  3. #define LMAX 18
  4. using namespace std;
  5. ifstream f("minisecvente.in");
  6. ofstream g("minisecvente.out");
  7. int andru, pad, andrada[NMAX], tomp[NMAX],vio[LMAX][NMAX], ru, dont, copii;
  8. long long asp;
  9.  
  10. int minim(int st, int dr)
  11. {
  12. int diff, sh, l;
  13. diff=dr-st+1;
  14. l=tomp[diff];
  15. sh=diff - (1<<l);
  16. return min(vio[l][st],vio[l][st+sh]);
  17. }
  18.  
  19. int caut(int st, int dr)
  20. {
  21. if(st > dr) return 0;
  22. else
  23. {
  24. int mij = (st + dr) / 2;
  25. if((minim(mij,pad) < pad-mij+1)and(minim(mij+1,pad) >= pad-mij))return mij;
  26. if(minim(mij,pad) >= pad-mij+1) return caut(st,mij);
  27. else return caut(mij+1,dr);
  28. }
  29. }
  30.  
  31. int main()
  32. {
  33. f >> andru;
  34. for(pad = 1; pad <= andru; pad++)
  35. f >> andrada[pad];
  36. tomp[1]=0;
  37. for (pad = 2; pad <= andru; pad++)
  38. tomp[pad] = tomp[pad/2] + 1;
  39.  
  40. for (pad = 1; pad <= andru; pad++)
  41. vio[0][pad] = andrada[pad];
  42.  
  43. for (pad=1; (1 << pad) <=andru; pad++)
  44. for (copii=1; copii <= andru - (1 << pad)+1; copii++)
  45. {
  46. dont=1<<(pad-1);
  47. vio[pad][copii]= min( vio[pad-1][copii] , vio[pad-1][copii+dont] );
  48. }
  49. asp = 0;
  50. for(pad = 1; pad <= andru; pad++)
  51. {
  52. if(minim(1,pad) < pad)
  53. {
  54. ru = caut(1,pad);
  55. asp += ru;
  56. }
  57. }
  58. g << asp;
  59. return 0;
  60. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement