結果
問題 | No.2281 K → K-1 01 Flip |
ユーザー | 👑 Nachia |
提出日時 | 2023-04-21 22:02:32 |
言語 | C++17 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 194 ms / 2,000 ms |
コード長 | 3,872 bytes |
コンパイル時間 | 1,118 ms |
コンパイル使用メモリ | 83,832 KB |
実行使用メモリ | 12,636 KB |
最終ジャッジ日時 | 2024-11-06 15:32:35 |
合計ジャッジ時間 | 14,995 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2 ms
6,820 KB |
testcase_01 | AC | 34 ms
7,912 KB |
testcase_02 | AC | 131 ms
7,752 KB |
testcase_03 | AC | 157 ms
12,216 KB |
testcase_04 | AC | 38 ms
6,816 KB |
testcase_05 | AC | 74 ms
8,016 KB |
testcase_06 | AC | 113 ms
7,888 KB |
testcase_07 | AC | 57 ms
12,372 KB |
testcase_08 | AC | 107 ms
12,452 KB |
testcase_09 | AC | 123 ms
6,816 KB |
testcase_10 | AC | 103 ms
6,820 KB |
testcase_11 | AC | 49 ms
7,724 KB |
testcase_12 | AC | 58 ms
12,280 KB |
testcase_13 | AC | 124 ms
6,820 KB |
testcase_14 | AC | 84 ms
7,972 KB |
testcase_15 | AC | 33 ms
6,816 KB |
testcase_16 | AC | 133 ms
7,772 KB |
testcase_17 | AC | 157 ms
7,960 KB |
testcase_18 | AC | 133 ms
7,640 KB |
testcase_19 | AC | 82 ms
12,252 KB |
testcase_20 | AC | 43 ms
6,816 KB |
testcase_21 | AC | 72 ms
12,144 KB |
testcase_22 | AC | 123 ms
6,816 KB |
testcase_23 | AC | 9 ms
6,816 KB |
testcase_24 | AC | 67 ms
6,820 KB |
testcase_25 | AC | 47 ms
6,816 KB |
testcase_26 | AC | 66 ms
12,052 KB |
testcase_27 | AC | 119 ms
12,244 KB |
testcase_28 | AC | 66 ms
12,372 KB |
testcase_29 | AC | 5 ms
6,820 KB |
testcase_30 | AC | 71 ms
6,820 KB |
testcase_31 | AC | 96 ms
8,020 KB |
testcase_32 | AC | 130 ms
12,108 KB |
testcase_33 | AC | 75 ms
7,776 KB |
testcase_34 | AC | 91 ms
6,820 KB |
testcase_35 | AC | 98 ms
12,344 KB |
testcase_36 | AC | 100 ms
6,816 KB |
testcase_37 | AC | 121 ms
7,768 KB |
testcase_38 | AC | 115 ms
6,816 KB |
testcase_39 | AC | 62 ms
6,816 KB |
testcase_40 | AC | 37 ms
7,856 KB |
testcase_41 | AC | 194 ms
12,388 KB |
testcase_42 | AC | 189 ms
12,628 KB |
testcase_43 | AC | 189 ms
12,400 KB |
testcase_44 | AC | 190 ms
12,352 KB |
testcase_45 | AC | 190 ms
12,568 KB |
testcase_46 | AC | 180 ms
12,572 KB |
testcase_47 | AC | 188 ms
12,364 KB |
testcase_48 | AC | 188 ms
12,636 KB |
testcase_49 | AC | 189 ms
12,476 KB |
testcase_50 | AC | 187 ms
12,528 KB |
testcase_51 | AC | 176 ms
12,392 KB |
testcase_52 | AC | 179 ms
12,360 KB |
testcase_53 | AC | 178 ms
12,528 KB |
testcase_54 | AC | 181 ms
12,552 KB |
testcase_55 | AC | 178 ms
12,524 KB |
testcase_56 | AC | 178 ms
12,452 KB |
ソースコード
#line 1 "..\\Main.cpp" #include <iostream> #include <string> #include <vector> #include <algorithm> #include <atcoder/modint> #include <atcoder/fenwicktree> #line 2 "D:\\Programming\\VSCode\\competitive-cpp\\nachia\\array\\segment-tree.hpp" #line 4 "D:\\Programming\\VSCode\\competitive-cpp\\nachia\\array\\segment-tree.hpp" namespace nachia{ template< class S, S op(S l, S r) > struct SegmentTree { private: int N; std::vector<S> A; void mergev(int i){ if(i < N) A[i] = op(A[i*2], A[i*2+1]); } public: SegmentTree(int n, S e){ N = 1; while (N < n) N *= 2; A.assign(N * 2, e); } SegmentTree(const std::vector<S>& a, S e) : SegmentTree(a.size(), e){ for(int i=0; i<(int)a.size(); i++) A[i + N] = a[i]; for(int i=N-1; i>=1; i--) mergev(i); } void set(int p, S x){ p += N; A[p] = x; for(int d=1; (1<<d)<=N; d++) mergev(p>>d); } S get(int p){ return A[N+p]; } S prod(int l, int r) const { l += N; r += N; S ql = A[0], qr = A[0]; while(l<r){ if(l&1) ql = op(ql, A[l++]); if(r&1) qr = op(A[--r], qr); l /= 2; r /= 2; } return op(ql, qr); } S allProd() const { return A[1]; } // bool cmp(S) template<class E> int minLeft(int r, E cmp, int a = 0, int b = 0, int i = -1){ static S x; if(i == -1){ a=0; b=N; i=1; x=A[0]; } if(r <= a) return a; if(b <= r){ S nx = op(A[i], x); if(cmp(nx)){ x = nx; return a; } } if(b - a == 1) return b; int q = minLeft(r, cmp, (a+b)/2, b, i*2+1); if(q > (a+b)/2) return q; return minLeft(r, cmp, a, (a+b)/2, i*2); } // bool cmp(S) template<class E> int maxRight(int l, E cmp, int a = 0, int b = 0, int i = -1){ static S x; if(i == -1){ a=0; b=N; i=1; x=A[0]; } if(b <= l) return b; if(l <= a){ S nx = op(x, A[i]); if(cmp(nx)){ x = nx; return b; } } if(b - a == 1) return a; int q = maxRight(l, cmp, a, (a+b)/2, i*2); if(q < (a+b)/2) return q; return maxRight(l, cmp, (a+b)/2, b, i*2+1); } }; } // namespace nachia #line 8 "..\\Main.cpp" using namespace std; using i32 = int; using u32 = unsigned int; using i64 = long long; using u64 = unsigned long long; #define rep(i,n) for(int i=0; i<(int)(n); i++) const i64 INF = 1001001001001001001; using Modint = atcoder::static_modint<998244353>; struct Mon { int len = 0; int llen = 0; int rlen = 0; int maxlen = 0; }; Mon op(Mon l, Mon r){ Mon res; res.maxlen = max({ l.maxlen, r.maxlen, l.rlen + r.llen }); res.llen = l.llen; if(l.len != -1) res.llen = l.len + r.llen; res.rlen = r.rlen; if(r.len != -1) res.rlen = r.len + l.rlen; res.len = -1; if(l.len != -1 && r.len != -1) res.len = l.len + r.len; return res; } int main(){ int N, Q; cin >> N >> Q; string S; cin >> S; atcoder::fenwick_tree<int> rangesum(N); rep(i,N) rangesum.add(i, S[i] == '0' ? -1 : 1); nachia::SegmentTree<Mon, op> seg(N, Mon()); rep(i,N){ if(i != 0 && S[i-1] != S[i]) seg.set(i, Mon{-1,0,1,1}); else seg.set(i, Mon{1,1,1,1}); } rep(q,Q){ int l, r, k; cin >> l >> r >> k; l--; int smod = k * 2 - 1; int s = ((rangesum.sum(l, r) % smod) + smod) % smod; int maxlen = seg.prod(l, r).maxlen; if(maxlen < k){ cout << (r-l) << '\n'; } else{ if(s >= k) s -= smod; s = abs(s); cout << (k*2-2 - s) << '\n'; } } return 0; } struct ios_do_not_sync{ ios_do_not_sync(){ ios::sync_with_stdio(false); cin.tie(nullptr); } } ios_do_not_sync_instance;