Advertisement
Guest User

Untitled

a guest
Nov 21st, 2014
135
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.52 KB | None | 0 0
  1. /*
  2.  
  3.     Author of solution {
  4.  
  5.            gskhirtladze;
  6.  
  7.     }
  8.  
  9. */
  10.  
  11. #include <iostream>
  12. #include <stdio.h>
  13. #include <math.h>
  14. #include <algorithm>
  15. #include <string>
  16. #include <vector>
  17. #include <map>
  18. #include <queue>
  19. #include <string>
  20.  
  21. #define fi first
  22. #define se second
  23. #define pb push_back
  24. #define mk make_pair
  25. #define Pii pair < int , int >
  26. #define tree int t,int l,int r
  27. #define left 2*t,l,(l+r)/2
  28. #define right 2*t+1,(l+r)/2+1,r
  29. #define f_sum(i,r) for (int i=r;i>=0;i=(i&(i+1))-1)
  30. #define f_upd(i,a,r) for (int i=a;i<=r;i=(i|(i+1)))
  31. #define MA(a,b) ((a)>(b)?(a):(b))
  32. #define MI(a,b) ((a)<(b)?(a):(b))
  33. #define AB(a) (-(a)<(a)?(a):-(a))
  34. #define ged(x) scanf("%I64d",&x)
  35. #define getcx getchar//_unlocked
  36. #define put(x) cout<<x<<endl;
  37. #define pud(x) printf("%.12f\n",x);
  38. #define LL long long
  39. #define INF 1000000000
  40. #define eps 0.00000001
  41. #define P7 1000000007
  42. #define P9 1000000009
  43. #define N3 2555
  44. #define N5 262145
  45.  
  46. using namespace std;
  47.  
  48. inline void inp(int &n )
  49.  {n=0; int ch=getcx();int sign=1;
  50.   while(ch<'0'||ch>'9'){if(ch=='-')sign=-1; ch=getcx();}
  51.   while(  ch >= '0' && ch <= '9' ) n=(n<<3)+(n<<1)+ch-'0',ch=getcx();
  52.   n=n*sign;}
  53.  
  54.  
  55. int tst;
  56. void get_ready() {
  57.      //freopen(".in","r",stdin);
  58.      //freopen(".out","w",stdout);
  59.      tst=1; //inp(tst);
  60. }
  61.  
  62. int mi[N5],ma[N5],tr[N5],ans[N5],a[N5],la,mii,maa;
  63.  
  64. void build (tree)
  65.  {
  66.   if (l == r)
  67.   {
  68.    ma[t]=a[l];
  69.    mi[t]=a[l];
  70.    return ;
  71.   }
  72.   build (left);
  73.   build (right);
  74.   ma[t]=MA(ma[2*t],ma[2*t+1]);
  75.   mi[t]=MI(mi[2*t],mi[2*t+1]);
  76.  }
  77.  
  78. void get_mi(tree,int L,int R)
  79.  {
  80.   if (l > R || L > r) return;
  81.   if (L <= l && r <= R) { la=MI(la,tr[t]); return; }
  82.   get_mi(left,L,R);
  83.   get_mi(right,L,R);
  84.  }
  85.  
  86. void get_m(tree,int L,int R)
  87.  {
  88.   if (l > R || L > r) return;
  89.   if (L <= l && r <= R) { mii=MI(mii,mi[t]); maa=MA(maa,ma[t]); return; }
  90.   get_m(left,L,R);
  91.   get_m(right,L,R);
  92.  }
  93.  
  94. void upd_mi(tree,int i,int la)
  95.  {
  96.   if (l > i || i > r) return;
  97.   if (l == r) { tr[t]=la; return; }
  98.   upd_mi(left,i,la);
  99.   upd_mi(right,i,la);
  100.   tr[t]=MI(tr[2*t],tr[2*t+1]);
  101.  }
  102.  
  103. int n,s,L,i;
  104.  
  105. main()
  106.  {
  107.  cin>>n>>s>>L;
  108. for (i=1;i<=n;i++)
  109.      cin>>a[i];
  110.  build(1,1,n);
  111.  for (i=1;i<=n;i++)
  112.   {
  113.    int l=1,r=i,m=0,mid=-1;
  114.    while (l <= r)
  115.     {
  116.      m=(l+r)/2;
  117.      mii=INF;
  118.      maa=-INF;
  119.      get_m(1,1,n,m,i);
  120.      if (maa-mii <= s) { mid=m; r=m-1; } else l=m+1;
  121.     }
  122.    mid=mid-1;
  123.    la=INF;
  124.    get_mi(1,0,n,mid,i-L);
  125.    upd_mi(1,0,n,i,la+1);
  126.    ans[i]=la+1;
  127.   }
  128. if (ans[n] >= INF) ans[n]=-1;
  129. cout<<ans[n]<<endl;
  130.  }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement