UVa12697 Minimum Subarray Length

まだ考え中。現時点で二回練習に出ている。


続きを読むをすると、多くの人が書く正答コードが見られる。

#include <bits/stdc++.h>

using namespace std;

#define allof(c) (c).begin(), (c).end()

typedef long long ll;

int const INF = 1<<29;

int main() {

  int Tc; cin >> Tc;
  while(Tc--) {
    int N, X; cin >> N >> X;
    
    ll sum = 0;
    vector<pair<ll, int> > vec;
    for(int i=0; i<N; i++) {
      int a; cin >> a;
      sum += a;
      vec.push_back(make_pair(sum, i+1));
    }
    
    sort(allof(vec));
    
    int ans = INF;
    set<int> st;
    for(int low=N-1, high=N-1; low>=0; --low) {
      while(high >= 0 && vec[low].first+X <= vec[high].first) {
	st.insert(vec[high--].second);
      }
      set<int>::iterator it = st.upper_bound(vec[low].second);
      if(it != st.end()) {
	ans = min(ans, *it - vec[low].second);
      }
    }
    cout << (ans == INF ? -1 : ans) << endl;
  }
  
  return 0;
}