結果
| 問題 |
No.230 Splarraay スプラレェーイ
|
| コンテスト | |
| ユーザー |
srup٩(๑`н´๑)۶
|
| 提出日時 | 2016-09-02 02:16:04 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 2,127 bytes |
| コンパイル時間 | 826 ms |
| コンパイル使用メモリ | 68,148 KB |
| 実行使用メモリ | 12,672 KB |
| 最終ジャッジ日時 | 2024-11-15 17:28:47 |
| 合計ジャッジ時間 | 58,042 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 8 TLE * 9 |
ソースコード
#include <iostream>
#include <algorithm>
#include <vector>
#include <cstdio>
#include <map>
typedef long long ll;
using namespace std;
#define rep(i,n) for(int i=0;i<(n);i++)
const int MAX_N = 200010;//頂点数の倍ぐらい持っておかないとダメ?
ll seg[MAX_N * 2], lazy[MAX_N * 2] = {-1};
struct segtree{
void lazy_evaluate_node(int k, int l, int r){
if(lazy[k] != -1){
seg[k] = lazy[k] * (r - l);
if(r - l > 1){
lazy[k * 2 + 1] = lazy[k];
lazy[k * 2 + 2] = lazy[k];
}
lazy[k] = -1;
}
}
//update(a,b,v) := [a,b)を全てvに書き換える
void update(int a, int b, ll v, int k = 0, int l = 0, int r = MAX_N){
lazy_evaluate_node(k, l, r);//辿ったノードはついでについでに伝搬しておく
if(r <= a || b <= l) return;
if(a <= l && r <= b){
lazy[k] = v;
lazy_evaluate_node(k, l, r);//一回遅延評価しとかないと都合悪い??
}else{
update(a, b, v, k * 2 + 1, l, (l + r) / 2);
update(a, b, v, k * 2 + 2, (l + r) / 2, r);
seg[k] = seg[k * 2 + 1] + seg[k * 2 + 2];
}
}
//get(l,r) := [a,b)に対する総和を求める
ll get(int a, int b, int k = 0, int l = 0, int r = MAX_N){
// printf("%d %d\n", a, b);
lazy_evaluate_node(k, l, r);//辿ったノードはついでについでに伝搬しておく
if(r <= a || b <= l) return 0;
if(a <= l && r <= b) return seg[k];
ll x = get(a, b, k * 2 + 1, l, (l + r) / 2);
ll y = get(a, b, k * 2 + 2, (l + r) / 2, r);
return x + y;
}
};
int main(void){
int n; cin >> n;
int q; cin >> q;
segtree st;
ll ansa = 0, ansb = 0;
rep(i, q){
int x; cin >> x;
int left, right; cin >> left >> right;
if(x == 0){//ボーナス
int sa = 0, sb = 0;
for (int j = left; j <= right; ++j){
if(st.get(j, j + 1) == 1) sa++;
else if(st.get(j, j + 1) == 2) sb++;
}
if(sa > sb) ansa += sa;
else if(sa < sb) ansb += sb;
}else if(x == 1){
st.update(left, right + 1, 1);
}else{
st.update(left, right + 1, 2);
}
}
rep(i, n){
if(st.get(i, i + 1) == 1) ansa++;
else if(st.get(i, i + 1) == 2) ansb++;
}
printf("%lld %lld\n", ansa, ansb);
return 0;
}
srup٩(๑`н´๑)۶