結果

問題 No.935 う し た ぷ に き あ く ん 笑 ビ - ム
ユーザー HaarHaar
提出日時 2019-11-29 22:56:07
言語 C++17
(gcc 12.3.0 + boost 1.83.0)
結果
TLE  
実行時間 -
コード長 3,809 bytes
コンパイル時間 2,704 ms
コンパイル使用メモリ 215,232 KB
実行使用メモリ 13,760 KB
最終ジャッジ日時 2024-05-01 00:43:04
合計ジャッジ時間 11,740 ms
ジャッジサーバーID
(参考情報)
judge1 / judge2
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 48 ms
13,760 KB
testcase_01 AC 616 ms
6,816 KB
testcase_02 AC 41 ms
6,940 KB
testcase_03 AC 753 ms
6,940 KB
testcase_04 AC 965 ms
6,944 KB
testcase_05 AC 83 ms
6,940 KB
testcase_06 AC 1,443 ms
6,940 KB
testcase_07 AC 1,448 ms
6,944 KB
testcase_08 TLE -
testcase_09 -- -
testcase_10 -- -
testcase_11 -- -
testcase_12 -- -
testcase_13 -- -
testcase_14 -- -
testcase_15 -- -
testcase_16 -- -
testcase_17 -- -
testcase_18 -- -
testcase_19 -- -
testcase_20 -- -
testcase_21 -- -
testcase_22 -- -
testcase_23 -- -
testcase_24 -- -
testcase_25 -- -
testcase_26 -- -
testcase_27 -- -
testcase_28 -- -
testcase_29 -- -
testcase_30 -- -
testcase_31 -- -
testcase_32 -- -
testcase_33 -- -
testcase_34 -- -
testcase_35 -- -
testcase_36 -- -
testcase_37 -- -
testcase_38 -- -
testcase_39 -- -
testcase_40 -- -
testcase_41 -- -
testcase_42 -- -
testcase_43 -- -
testcase_44 -- -
testcase_45 -- -
testcase_46 -- -
testcase_47 -- -
testcase_48 -- -
testcase_49 -- -
testcase_50 -- -
testcase_51 -- -
testcase_52 -- -
testcase_53 -- -
testcase_54 -- -
testcase_55 -- -
testcase_56 -- -
testcase_57 -- -
testcase_58 -- -
testcase_59 -- -
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <bits/stdc++.h>
#define LLI long long int
#define FOR(v, a, b) for(LLI v = (a); v < (b); ++v)
#define FORE(v, a, b) for(LLI v = (a); v <= (b); ++v)
#define REP(v, n) FOR(v, 0, n)
#define REPE(v, n) FORE(v, 0, n)
#define REV(v, a, b) for(LLI v = (a); v >= (b); --v)
#define ALL(x) (x).begin(), (x).end()
#define RALL(x) (x).rbegin(), (x).rend()
#define ITR(it, c) for(auto it = (c).begin(); it != (c).end(); ++it)
#define RITR(it, c) for(auto it = (c).rbegin(); it != (c).rend(); ++it)
#define EXIST(c,x) ((c).find(x) != (c).end())
#define fst first
#define snd second
#define popcount __builtin_popcount
#define UNIQ(v) (v).erase(unique(ALL(v)), (v).end())
#define bit(i) (1LL<<(i))

#ifdef DEBUG
#include <misc/C++/Debug.cpp>
#else
#define dump(...) ((void)0)
#endif

#define gcd __gcd

using namespace std;
template <class T> constexpr T lcm(T m, T n){return m/gcd(m,n)*n;}

template <typename I> void join(ostream &ost, I s, I t, string d=" "){for(auto i=s; i!=t; ++i){if(i!=s)ost<<d; ost<<*i;}ost<<endl;}
template <typename T> istream& operator>>(istream &is, vector<T> &v){for(auto &a : v) is >> a; return is;}
template <typename T, typename U> bool chmin(T &a, const U &b){return (a>b ? a=b, true : false);}
template <typename T, typename U> bool chmax(T &a, const U &b){return (a<b ? a=b, true : false);}
template <typename T, size_t N, typename U> void fill_array(T (&a)[N], const U &v){fill((U*)a, (U*)(a+N), v);}

struct Init{
  Init(){
    cin.tie(0);
    ios::sync_with_stdio(false);
    cout << fixed << setprecision(12);
    cerr << fixed << setprecision(12);
  }
}init;


/**
 * @details eは単位元
 */
template <typename T, typename Func>
class SegmentTree{
protected:
  int size;
  std::vector<T> data;
  const T e;
  const Func f;

  inline T get_aux(int x, int y, int i, int l, int r) const {
    if(r <= x || y <= l) return e;
    else if(x <= l && r <= y) return data[i];
    else return f(get_aux(x,y,i*2+1,l,(l+r)/2), get_aux(x,y,i*2+2,(l+r)/2,r));
  };

public:
  SegmentTree(int n, const T &e, const Func &f): e(e), f(f){
    size = 1;
    while(size < n) size *= 2;
    size = size*2-1;
    data = std::vector<T>(size, e);
  }

  inline T operator[](int i) const {
    return at(i);
  }

  inline T at(int i) const {
  	return data[(size+1)/2 + i - 1];
  }

  inline T get(int x, int y) const { // [x,y)
    return get_aux(x,y,0,0,(size+1)/2);
  }

  inline void update(int i, const T &x){
    int j = i+(size+1)/2-1;
    data[j] = x;
    --j;
    while(j>=0){
      data[j/2] = f(data[(j/2)*2+1], data[(j/2)*2+2]);
      (j /= 2) -= 1;
    }
  }

  void debug(){
#ifdef DEBUG
    std::cerr << "{";

    for(int i = 0; i <= size/2; ++i){
      if(i) std::cerr << ",";
      std::cerr << data[(size+1) / 2 + i - 1];
    }

    std::cerr << "}" << std::endl;
#endif
  }
};


template <typename T>
auto make_segment_tree_range_sum(int size, const T &e){
  auto f = [](const auto &a, const auto &b){return a + b;};
  return SegmentTree<T, decltype(f)>(size, e, f);
}




int main(){
  int N;
  string S;
  while(cin >> N >> S){
    vector<LLI> A(N); cin >> A;
    int Q; cin >> Q;

    auto seg1 = make_segment_tree_range_sum<LLI>(N, 0);
    auto seg2 = make_segment_tree_range_sum<int>(N, 0);

    REP(i,N){
      seg1.update(i, A[i]);
      if(S[i] == 'E') seg2.update(i, 1);
    }
    
    

    REP(_,Q){
      LLI K; cin >> K;
      int ans = 0;

      REP(i,N){
        {
          int lb = i-1, ub = N;
          while(abs(lb-ub) > 1){
            int mid = (lb+ub) / 2;

            if(seg1.get(i, mid+1) <= K){
              lb = mid;
            }else{
              ub = mid;
            }
          }

          chmax(ans, seg2.get(i, lb+1));
        }
        


        
      }


      

      cout << ans << endl;
    }
    cerr << endl;
  }
  
  return 0;
}
0