Advertisement
a53

minisecvente

a53
Apr 4th, 2019
158
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.08 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 n,i,a[NMAX],tomp[NMAX],vio[LMAX][NMAX],ru,dont,j;
  8. long long sol;
  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)
  22. return 0;
  23. else
  24. {
  25. int mij=(st+dr)/2;
  26. if((minim(mij,i)<i-mij+1)&&(minim(mij+1,i)>=i-mij))
  27. return mij;
  28. if(minim(mij,i)>=i-mij+1)
  29. return caut(st,mij);
  30. else
  31. return caut(mij+1,dr);
  32. }
  33. }
  34.  
  35. int main()
  36. {
  37. f>>n;
  38. for(i=1;i<=n;++i)
  39. f>>a[i];
  40. tomp[1]=0;
  41. for(i=2;i<=n;++i)
  42. tomp[i]=tomp[i/2]+1;
  43. for(i=1;i<=n;++i)
  44. vio[0][i]=a[i];
  45. for(i=1;(1<<i)<=n;++i)
  46. for(j=1;j<=n-(1<<i)+1;++j)
  47. dont=1<<(i-1),vio[i][j]=min(vio[i-1][j],vio[i-1][j+dont] );
  48. sol=0;
  49. for(i=1;i<=n;++i)
  50. if(minim(1,i)<i)
  51. ru=caut(1,i),sol+=ru;
  52. g<<sol;
  53. return 0;
  54. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement