結果
問題 | No.619 CardShuffle |
ユーザー | paruki |
提出日時 | 2017-12-31 23:21:40 |
言語 | C++14 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 441 ms / 3,000 ms |
コード長 | 2,962 bytes |
コンパイル時間 | 1,764 ms |
コンパイル使用メモリ | 174,132 KB |
実行使用メモリ | 13,824 KB |
最終ジャッジ日時 | 2024-06-02 05:34:35 |
合計ジャッジ時間 | 9,752 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 4 ms
9,472 KB |
testcase_01 | AC | 4 ms
9,560 KB |
testcase_02 | AC | 4 ms
9,472 KB |
testcase_03 | AC | 4 ms
9,472 KB |
testcase_04 | AC | 5 ms
9,600 KB |
testcase_05 | AC | 4 ms
9,472 KB |
testcase_06 | AC | 5 ms
9,472 KB |
testcase_07 | AC | 5 ms
9,532 KB |
testcase_08 | AC | 4 ms
9,472 KB |
testcase_09 | AC | 5 ms
9,600 KB |
testcase_10 | AC | 5 ms
9,472 KB |
testcase_11 | AC | 4 ms
9,472 KB |
testcase_12 | AC | 4 ms
9,460 KB |
testcase_13 | AC | 5 ms
9,472 KB |
testcase_14 | AC | 5 ms
9,472 KB |
testcase_15 | AC | 4 ms
9,472 KB |
testcase_16 | AC | 373 ms
13,696 KB |
testcase_17 | AC | 346 ms
13,696 KB |
testcase_18 | AC | 365 ms
13,824 KB |
testcase_19 | AC | 348 ms
13,696 KB |
testcase_20 | AC | 331 ms
13,824 KB |
testcase_21 | AC | 308 ms
13,696 KB |
testcase_22 | AC | 286 ms
13,696 KB |
testcase_23 | AC | 300 ms
13,824 KB |
testcase_24 | AC | 278 ms
13,696 KB |
testcase_25 | AC | 250 ms
13,696 KB |
testcase_26 | AC | 406 ms
13,824 KB |
testcase_27 | AC | 417 ms
13,824 KB |
testcase_28 | AC | 441 ms
13,824 KB |
testcase_29 | AC | 409 ms
13,824 KB |
testcase_30 | AC | 388 ms
13,696 KB |
testcase_31 | AC | 5 ms
9,520 KB |
testcase_32 | AC | 330 ms
13,696 KB |
testcase_33 | AC | 384 ms
13,696 KB |
testcase_34 | AC | 392 ms
13,696 KB |
testcase_35 | AC | 160 ms
9,560 KB |
ソースコード
#include "bits/stdc++.h" using namespace std; #define FOR(i,j,k) for(int (i)=(j);(i)<(int)(k);++(i)) #define rep(i,j) FOR(i,0,j) #define each(x,y) for(auto &(x):(y)) #define mp make_pair #define mt make_tuple #define all(x) (x).begin(),(x).end() #define debug(x) cout<<#x<<": "<<(x)<<endl #define smax(x,y) (x)=max((x),(y)) #define smin(x,y) (x)=min((x),(y)) #define MEM(x,y) memset((x),(y),sizeof (x)) #define sz(x) (int)(x).size() #define pb push_back typedef long long ll; typedef pair<int, int> pii; typedef vector<int> vi; typedef vector<ll> vll; const int MO = (int)1e9 + 7; int N, n; string op="+"; vi va; const int R = 1 << 18 | 1; vi z[R]; vi mrg(vi &a, vi &b, char o) { if (!sz(a))return b; if (!sz(b))return a; vi r; r.reserve(6); each(x, a)r.push_back(x); if (o == '+') { r.push_back(b[0]); } else { r.back() = (ll)r.back() * b[0] % MO; } FOR(i, 1, sz(b))r.push_back(b[i]); if (sz(r) > 3)swap(r[2], r.back()); while (sz(r) > 3) { (r[1] += r.back()) %= MO; r.pop_back(); } return r; } void upd(int k, int l, int r, int idx, int val, char o) { if (r - l == 1) { z[k][0] = val; va[l] = val; op[l] = o; return; } int kl = 2 * k + 1; int kr = 2 * k + 2; int m = (l + r) >> 1; if (idx < m)upd(kl, l, m, idx, val, o); else upd(kr, m, r, idx, val, o); z[k] = mrg(z[kl], z[kr], op[m]); } vi query(int k, int l, int r, int x, int y) { if (r <= x || l >= y)return vi(0); if (x <= l && r <= y) return z[k]; int kl = 2 * k + 1; int kr = 2 * k + 2; int m = (l + r) >> 1; vi a = query(kl, l, m, x, y); vi b = query(kr, m, r, x, y); return mrg(a, b, op[m]); } int main(){ ios::sync_with_stdio(false); cin.tie(0); cin >> N; rep(i, N) { char c; cin >> c; if (i & 1)op += c; else va.push_back(c - '0'); } N = 1; while (N < sz(op))N *= 2; while (sz(op) < N) { op += '+'; va.push_back(0); } rep(i, 2 * N + 1) { z[i].reserve(6); z[i].push_back(0); } rep(i, N) { upd(0, 0, N, i, va[i], op[i]); } int Q; cin >> Q; while (Q--) { char T; int X, Y; cin >> T >> X >> Y; if (T == '!') { int md = X % 2; X /= 2; Y /= 2; if (md == 1) { // num int vx = va[X], vy = va[Y]; upd(0, 0, N, X, vy, op[X]); upd(0, 0, N, Y, vx, op[Y]); } else { char ox = op[X], oy = op[Y]; upd(0, 0, N, X, va[X], oy); upd(0, 0, N, Y, va[Y], ox); } } else { X /= 2; Y = Y / 2 + 1; ll ans = 0; auto w = query(0, 0, N, X, Y); each(x, w)ans += x; cout << ans%MO << endl; } } }