Advertisement
Guest User

Untitled

a guest
Jan 3rd, 2014
253
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.35 KB | None | 0 0
  1. /**
  2.  * with the help of God
  3.  */
  4. #include <iostream>
  5. #include <cstdio>
  6. #include <set>
  7. #include <queue>
  8. #include <stack>
  9. #include <cstdlib>
  10. #include <cstring>
  11. #include <climits>
  12. #include <cmath>
  13. #include <deque>
  14. #include <algorithm>
  15. #include <vector>
  16. #include <cassert>
  17. #include <fstream>
  18. #include <sstream>
  19. #include <iomanip>
  20. #include <list>
  21. #include <complex>
  22. #include <functional>
  23.  
  24. using namespace std;
  25.  
  26. //typedef
  27.  
  28. typedef long long ll;
  29. typedef long double ld;
  30. typedef unsigned int ui;
  31. typedef unsigned long long ull;
  32. typedef pair<int,int> pii;
  33.  
  34. //define
  35.  
  36. #define gi ({int t; scanf("%d",&t); t;})
  37. #define gl ({ll t; scanf("%lld",&t); t;})
  38. #define gd ({double t;scanf("%lf",&t); t;})
  39. #define rep(i,n) for(int i=0,_n=n;i<_n;i++)
  40. #define fr(i,a,b) for(int i=a;i<b;i++)
  41. #define frd(i,a,b)  for(int i=b;i>=a;i--)
  42. #define repd(i,n) for(int _n=n,i=_n-1;i>=0;--i)
  43. #define fit(i,v) for(__typeof((v).begin()) i =(v).begin(); i != (v).end(); ++i)
  44. #define fitd(i,v) for(__typeof((v).rbegin()) i=(v).rbegin(); i!=(v).rend();++i)
  45. #define pb push_back
  46. #define mp make_pair
  47. #define fi first
  48. #define se second
  49. #define ms(a,x) memset(a, x, sizeof(a))
  50. #define sz(c) (int)(c).size()
  51. #define dbg(x) cerr<<#x<<" = "<<(x)<<endl
  52. #define sqr(x) ((x)*(x))
  53. #define mod (ll) (1e4 + 7 + eps)
  54. #define READ(f) freopen(f, "r", stdin)
  55. #define WRITE(f) freopen(f, "w", stdout)
  56.  
  57.  
  58. // maximum subarray sum
  59. void mss(int* a, int n, int x){
  60.     rep(i,n){
  61.         if(a[i] >= x){ printf("1\n"); return; }
  62.     }
  63.     ll s[n];
  64.     deque <pii> dq;
  65.     s[0] = a[0];
  66.     ll cmx = a[0]; // current maximum
  67.     int st[n];
  68.     int start = 0;
  69.     st[0] = 0; // start point from where cmx is calculated
  70.     fr(i,1,n){
  71.         cmx = max(cmx+a[i],(ll)a[i]);
  72.         if(cmx == a[i]) start = i;
  73.         s[i] = cmx;
  74.         st[i] = start;
  75.     }
  76.     int mi = (1<<30)-1;
  77.     ll sp = 0; // sum of popped elements
  78.     rep(i,n){
  79.         while(dq.size() > 0 && dq[0].second < st[i]){ sp = 0; dq.pop_front(); }
  80.         ll ele = s[i]-sp;
  81.         dq.pb(pii(a[i],i));
  82.         if(ele < x) continue;
  83.         while(dq.size() > 0 && ele-dq[0].first >= x){
  84.             sp+=dq[0].first;
  85.                 ele-=dq[0].first;
  86.             dq.pop_front();  
  87.         }
  88.         mi = min(mi, sz(dq));
  89.     }
  90.     if(mi == (1<<30)-1) printf("-1\n");
  91.     else printf("%d\n",mi);
  92. }
  93.  
  94. void main2(){
  95.     int n, x;
  96.     n = gi, x = gi;
  97.     int a[n];
  98.     rep(i,n){
  99.         a[i] = gi;
  100.     }
  101.     mss(a,n,x);
  102. }
  103.  
  104. int main(){
  105.     int t;
  106.     t = gi;
  107.     while(t--) main2();        
  108. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement