結果
| 問題 |
No.230 Splarraay スプラレェーイ
|
| コンテスト | |
| ユーザー |
kurenai3110
|
| 提出日時 | 2016-09-02 05:18:53 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 3,426 bytes |
| コンパイル時間 | 663 ms |
| コンパイル使用メモリ | 72,644 KB |
| 実行使用メモリ | 7,296 KB |
| 最終ジャッジ日時 | 2024-11-15 17:55:10 |
| 合計ジャッジ時間 | 2,523 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 15 WA * 2 |
ソースコード
#include <iostream>
#include <map>
#include <vector>
using namespace std;
typedef long long ll;
#define rep(i,n) for(int i=0;i<n;i++)
#define repr(i,n) for(int i=n-1;i>=0;i--)
struct ST {
//seg木と遅延
vector<ll> lazy;
vector<pair<int, int> >seg;
int size;
ST(int n) {
//seg木のサイズは(nが入るような2のべき乗のサイズ)*2
size = 1;
while (size < n) size *= 2;
seg.resize(size * 2);
lazy.resize(size * 2, -1); //-1で初期化
}
//遅延評価
void push(int k, int l, int r) {
if (lazy[k] != -1) { //遅延があるなら
//ノードkは区間内の1(first)と2(second)の数
//ノードkを更新
if (lazy[k] % 2) {
seg[k] = make_pair(r - l, 0);
}
else {
seg[k] = make_pair(0, r - l);
}
if (r - l > 1) { //子ノードがあるなら
lazy[k * 2 + 1] = lazy[k]; //ノードkの子(左)に伝搬
lazy[k * 2 + 2] = lazy[k]; //ノードkの子(右)に伝搬
}
lazy[k] = -1; //ノードkは伝搬し終わった
}
}
ll merge(ll x, ll y) {
return x + y;
}
//[a,b)をvに
//[l,r)はノードが持つ区間
void update(int a, int b, ll v, int k, int l, int r) {
//ノードkに対して遅延があるかもしれない
//その時ノードkは更新される
push(k, l, r);
if (r <= a || b <= l) return; //[a,b)がノードkの区間[l,r)と交差しない
if (a <= l && r <= b) { //[a,b)がノードkを完全に含む
lazy[k] = v; //ノードkの区間[l,r)はすべてvになったという情報
push(k, l, r); //子に伝搬
//ノードkを更新
}
else { //その他
//左の子をupdate
update(a, b, v, k * 2 + 1, l, (l + r) / 2);
//右の子をupdate
update(a, b, v, k * 2 + 2, (l + r) / 2, r);
//ノードkを更新
seg[k] = make_pair(merge(seg[k * 2 + 1].first, seg[k * 2 + 2].first), merge(seg[k * 2 + 1].second, seg[k * 2 + 2].second));
}
}
void update(int a, int b, ll v) {
update(a, b, v, 0, 0, size);
}
//[a,b)の1,2の数
//[l,r)はノードが持つ区間
pair<int,int> query(int a, int b, int k, int l, int r) {
//ノードkに対して遅延があるかもしれない
//その時ノードkは更新される
push(k, l, r);
if (r <= a || b <= l) return make_pair(0, 0); //[a,b)がノードkの区間[l,r)と交差しない時0を返す
if (a <= l && r <= b) return seg[k]; //[a,b)がノードkを完全に含む時そのノードの値を返す
//左の子の1,2の数
pair<int, int> x = query(a, b, k * 2 + 1, l, (l + r) / 2);
//右の子の1,2の数
pair<int, int> y = query(a, b, k * 2 + 2, (l + r) / 2, r);
return make_pair(merge(x.first,y.first), merge(x.second,y.second));//子の1,2のそれぞれの和を返す
}
pair<int, int> query(int a, int b) {
return query(a, b, 0, 0, size);
}
};
int main() {
int n,a=0,b=0;
cin >> n;
ST st(n);
int q; cin >> q;
for (int i = 0; i < q; i++) {
int x; cin >> x;
int l, r;
cin >> l >> r;
r++;
if (x == 1) {
st.update(l, r, x);
}else if(x==2){
st.update(l, r, x);
}
else if (x == 0) {
pair<int, int> bonus;
bonus = st.query(l, r);
if (bonus.first > bonus.second) a += bonus.first;
else if (bonus.first < bonus.second) b += bonus.second;
}
}
pair<int, int>result;
result = st.query(0, n);
cout << a + result.first << " " << b + result.second << endl;
return 0;
}
kurenai3110