結果
問題 | No.230 Splarraay スプラレェーイ |
ユーザー | ei1333333 |
提出日時 | 2015-08-30 16:16:08 |
言語 | C++11 (gcc 11.4.0) |
結果 |
AC
|
実行時間 | 97 ms / 5,000 ms |
コード長 | 2,769 bytes |
コンパイル時間 | 1,416 ms |
コンパイル使用メモリ | 164,292 KB |
実行使用メモリ | 6,528 KB |
最終ジャッジ日時 | 2024-07-18 15:39:08 |
合計ジャッジ時間 | 2,923 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 1 ms
5,248 KB |
testcase_01 | AC | 1 ms
5,376 KB |
testcase_02 | AC | 2 ms
5,376 KB |
testcase_03 | AC | 2 ms
5,376 KB |
testcase_04 | AC | 1 ms
5,376 KB |
testcase_05 | AC | 2 ms
5,376 KB |
testcase_06 | AC | 6 ms
5,376 KB |
testcase_07 | AC | 2 ms
5,376 KB |
testcase_08 | AC | 2 ms
5,376 KB |
testcase_09 | AC | 47 ms
5,376 KB |
testcase_10 | AC | 45 ms
5,376 KB |
testcase_11 | AC | 29 ms
5,376 KB |
testcase_12 | AC | 47 ms
5,376 KB |
testcase_13 | AC | 9 ms
5,376 KB |
testcase_14 | AC | 36 ms
6,400 KB |
testcase_15 | AC | 66 ms
6,528 KB |
testcase_16 | AC | 79 ms
6,528 KB |
testcase_17 | AC | 97 ms
6,272 KB |
testcase_18 | AC | 57 ms
6,528 KB |
testcase_19 | AC | 62 ms
6,400 KB |
コンパイルメッセージ
main.cpp: In function ‘int main()’: main.cpp:85:8: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 85 | scanf("%d", &N); | ~~~~~^~~~~~~~~~ main.cpp:87:8: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 87 | scanf("%d", &Q); | ~~~~~^~~~~~~~~~ main.cpp:92:10: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 92 | scanf("%d %d %d", &x, &l, &r); | ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
ソースコード
#include<bits/stdc++.h> using namespace std; struct SegmentTree { struct node { int RedSum, BlackSum; int Lazy; node():RedSum(0), BlackSum(0), Lazy(0){}; }; vector< node > seg; int sz; SegmentTree(int n) { sz = 1; while(sz < n) sz <<= 1; seg.assign(sz * 2 - 1, node()); } inline void Update(int k, int l, int r) { int &R = seg[k].RedSum, &B = seg[k].BlackSum; R = 0, B = 0; if(seg[2 * k + 1].Lazy == 0) R += seg[2 * k + 1].RedSum, B += seg[2 * k + 1].BlackSum; else if(seg[2 * k + 1].Lazy == 1) R += (l + r) / 2 - l; else B += (l + r) / 2 - l; if(seg[2 * k + 2].Lazy == 0) R += seg[2 * k + 2].RedSum, B += seg[2 * k + 2].BlackSum; else if(seg[2 * k + 2].Lazy == 1) R += r - (l + r) / 2; else B += r - (l + r) / 2; } inline void Evaluation(int k, int l, int r) { if(seg[k].Lazy == 0) return; if(k < sz - 1) { seg[2 * k + 1].Lazy = seg[k].Lazy; seg[2 * k + 2].Lazy = seg[k].Lazy; Update(k, l, r); } else { if(seg[k].Lazy == 1) seg[k].RedSum = 1, seg[k].BlackSum = 0; else seg[k].RedSum = 0, seg[k].BlackSum = 1; } seg[k].Lazy = 0; } inline void Write(int a, int b, int x, int k, int l, int r) { Evaluation(k, l, r); if(a >= r || b <= l) return; if(a <= l && r <= b) { seg[k].Lazy = x; Evaluation(k, l, r); } else { Write(a, b, x, 2 * k + 1, l, l + r >> 1); Write(a, b, x, 2 * k + 2, l + r >> 1, r); Update(k, l, r); } } inline void RedWrite(int a, int b) { Write(a, b, 1, 0, 0, sz); } inline void BlackWrite(int a, int b) { Write(a, b, 2, 0, 0, sz); } inline pair< int, int > CountSum(int a, int b, int k, int l, int r) { Evaluation(k, l, r); if(a >= r || b <= l) return(make_pair(0, 0)); if(a <= l && r <= b) return(make_pair(seg[k].RedSum, seg[k].BlackSum)); pair< int, int > L = CountSum(a, b, 2 * k + 1, l, l + r >> 1); pair< int, int > R = CountSum(a, b, 2 * k + 2, l + r >> 1, r); return(make_pair(L.first + R.first, L.second + R.second)); } inline pair< int, int > CountSum(int a, int b) { return(CountSum(a, b, 0, 0, sz)); } }; int main() { int N, Q; scanf("%d", &N); SegmentTree seg(N); scanf("%d", &Q); long long R = 0, B = 0; while(Q--) { int x, l, r; scanf("%d %d %d", &x, &l, &r); if(x == 0) { pair< int, int > Sum = seg.CountSum(l, r + 1); if(Sum.first > Sum.second) R += Sum.first; else if(Sum.first < Sum.second) B += Sum.second; } else if(x == 1) { seg.RedWrite(l, r + 1); } else { seg.BlackWrite(l, r + 1); } } pair< int, int > Sum = seg.CountSum(0, N); printf("%lld %lld\n", R + Sum.first, B + Sum.second); }