結果
| 問題 |
No.230 Splarraay スプラレェーイ
|
| コンテスト | |
| ユーザー |
ei1333333
|
| 提出日時 | 2015-08-30 16:16:08 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.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 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 17 |
コンパイルメッセージ
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);
}
ei1333333