結果
問題 | No.2080 Simple Nim Query |
ユーザー | umimel |
提出日時 | 2022-09-25 22:14:02 |
言語 | C++14 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 449 ms / 3,000 ms |
コード長 | 2,443 bytes |
コンパイル時間 | 1,625 ms |
コンパイル使用メモリ | 179,352 KB |
実行使用メモリ | 11,820 KB |
最終ジャッジ日時 | 2024-06-12 07:24:55 |
合計ジャッジ時間 | 5,708 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2 ms
6,812 KB |
testcase_01 | AC | 2 ms
6,940 KB |
testcase_02 | AC | 2 ms
6,944 KB |
testcase_03 | AC | 268 ms
6,940 KB |
testcase_04 | AC | 306 ms
6,940 KB |
testcase_05 | AC | 449 ms
11,820 KB |
testcase_06 | AC | 425 ms
11,760 KB |
testcase_07 | AC | 424 ms
11,788 KB |
testcase_08 | AC | 399 ms
11,768 KB |
testcase_09 | AC | 396 ms
11,764 KB |
testcase_10 | AC | 400 ms
11,792 KB |
ソースコード
#include <bits/stdc++.h> using namespace std; using ll = long long; using pll = pair<ll, ll>; #define drep(i, cc, n) for (ll i = (cc); i <= (n); ++i) #define rep(i, n) drep(i, 0, n - 1) #define all(a) (a).begin(), (a).end() #define pb push_back #define fi first #define se second const ll MOD = 1000000007; const ll MOD2 = 998244353; const ll INF = 1LL << 60; const ll MAX_N = 2e5; struct SegmentTree{ ll n; vector<pair<ll, bool>> dat; SegmentTree(ll n_){ n = 1; while(n < n_) n*=2; dat.resize(2*n, {0, false}); } void update(ll k, ll a){ k += n-1; if(a == 1) dat[k] = {1, true}; else dat[k] = {0, false}; while(k > 0){ k = (k-1)/2; if(dat[2*k+1].se && dat[2*k+2].se){ dat[k] = {dat[2*k+1].fi+dat[2*k+2].fi, true}; }else if(dat[2*k+2].se){ dat[k] = {dat[2*k+1].fi+dat[2*k+2].fi, false}; }else{ dat[k] = {dat[2*k+2].fi, false}; } } } // the minimun element of [a, b) ll query(ll a, ll b){return query_sub(a, b, 0, 0, n).fi;} pll query_sub(ll a, ll b, ll k, ll l, ll r){ if(r <= a || b <= l){ return {0, true}; }else if(a <= l && r <= b){ return dat[k]; }else{ pll vl = query_sub(a, b, 2*k+1, l, (l+r)/2); pll vr = query_sub(a, b, 2*k+2, (l+r)/2, r); if(vl.se && vr.se){ return {vl.fi+vr.fi, true}; }else if(vr.se){ return {vl.fi+vr.fi, false}; }else{ return {vr.fi, false}; } } } }; int main(){ ll n, q; cin >> n >> q; SegmentTree ST(n); rep(i, n){ ll a; cin >> a; ST.update(i, a); } vector<char> ans; rep(i, q){ ll t, x, y; cin >> t >> x >> y; if(t == 1){ ST.update(x-1, y); }else{ ll cnt = ST.query(x-1, y); if(cnt == y - x + 1){ if(cnt%2 == 1){ ans.pb('F'); }else{ ans.pb('S'); } }else{ if(ST.query(x-1, y)%2 == 0){ ans.pb('F'); }else{ ans.pb('S'); } } } } rep(i, (ll)ans.size()) cout << ans[i] << endl; }