結果
| 問題 | No.255 Splarrraaay スプラーレェーーイ |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-10-21 01:13:07 |
| 言語 | C++14 (gcc 15.3.0 + boost 1.92.0 + ACL) |
| 結果 |
MLE
不安定
|
| 実行時間 | - |
| コード長 | 3,362 bytes |
| 記録 | |
| コンパイル時間 | 429 ms |
| コンパイル使用メモリ | 78,572 KB |
| 実行使用メモリ | 1,301,888 KB |
| 最終ジャッジ日時 | 2026-10-21 01:13:30 |
| 合計ジャッジ時間 | 6,384 ms |
|
ジャッジサーバーID (参考情報) |
judge6_0 / judge5_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | MLE * 2 -- * 8 |
コンパイルメッセージ
main.cpp: In function 'int main()':
main.cpp:98:34: warning: 'ma_idx' may be used uninitialized [-Wmaybe-uninitialized]
98 | if (ma > 0 && ma_idx != -1) {
| ~~~~~~~^~~~~
main.cpp:89:25: note: 'ma_idx' was declared here
89 | int ma = 0, ma_idx;
| ^~~~~~
ソースコード
#include <iostream>
#include <cstdio>
using namespace std;
typedef long long LL;
const LL V = 1e13;
const int N = 150010;
int q;
LL n, ans[6];
struct Node {
int l, r, lz;
LL sum[6];
};
struct SegTree {
Node seg[N * 20];
int rt, idx;
void PushUp(int u) {
for (int i = 1; i <= 5; ++i) {
seg[u].sum[i] = seg[seg[u].l].sum[i] + seg[seg[u].r].sum[i];
}
}
void PushDown(int u, LL ul, LL ur) {
if (seg[u].lz) {
if (!seg[u].l) seg[u].l = ++idx;
if (!seg[u].r) seg[u].r = ++idx;
int mid = ul + ur >> 1;
seg[seg[u].l].lz = seg[seg[u].r].lz = seg[u].lz;
for (int i = 1; i <= 5; ++i) {
if (seg[u].lz == i) {
seg[seg[u].l].sum[i] = mid - ul + 1;
seg[seg[u].r].sum[i] = ur - mid;
} else {
seg[seg[u].l].sum[i] = 0;
seg[seg[u].r].sum[i] = 0;
}
}
seg[u].lz = 0;
}
}
void Modify(int &u, LL ul, LL ur, int l, int r, int id) {
if (!u) u = ++idx;
if (l <= ul && ur <= r) {
seg[u].lz = id;
for (int i = 1; i <= 5; ++i) {
if (i == id) seg[u].sum[i] += ur - ul + 1;
else seg[u].sum[i] = 0;
}
return;
}
PushDown(u, ul, ur);
LL mid = ul + ur >> 1;
if (mid >= l) Modify(seg[u].l, ul, mid, l, r, id);
if (mid + 1 <= r) Modify(seg[u].r, mid + 1, ur, l, r, id);
PushUp(u);
}
Node Query(int u, LL ul, LL ur, int l, int r) {
if (l <= ul && ur <= r) return seg[u];
PushDown(u, ul, ur);
Node ret = { 0, 0, 0 };
LL mid = ul + ur >> 1;
if (mid >= l) {
Node res = Query(seg[u].l, ul, mid, l, r);
for (int i = 1; i <= 5; ++i) ret.sum[i] += res.sum[i];
}
if (mid + 1 <= r) {
Node res = Query(seg[u].r, mid + 1, ur, l, r);
for (int i = 1; i <= 5; ++i) ret.sum[i] += res.sum[i];
}
return ret;
}
};
SegTree sgt;
int main() {
// freopen("color.in", "r", stdin);
// freopen("color.out", "w", stdout);
scanf("%lld%d", &n, &q);
while (q--) {
int op, l, r;
scanf("%d%d%d", &op, &l, &r);
if (op == 0) {
Node res = sgt.Query(sgt.rt, 0, V, l, r); // 最大值,多少个最大值
int ma = 0, ma_idx;
for (int i = 1; i <= 5; ++i) {
if (ma < res.sum[i]) {
ma = res.sum[i];
ma_idx = i;
} else if (ma == res.sum[i]) {
ma_idx = -1;
}
}
if (ma > 0 && ma_idx != -1) {
ans[ma_idx] += ma;
}
} else if (op == 1) {
sgt.Modify(sgt.rt, 0, V, l, r, 1);
} else if (op == 2) {
sgt.Modify(sgt.rt, 0, V, l, r, 2);
} else if (op == 3) {
sgt.Modify(sgt.rt, 0, V, l, r, 3);
} else if (op == 4) {
sgt.Modify(sgt.rt, 0, V, l, r, 4);
} else {
sgt.Modify(sgt.rt, 0, V, l, r, 5);
}
}
for (int i = 1; i <= 5; ++i) {
printf("%lld%c", ans[i] + sgt.seg[1].sum[i], " \n"[i == 5]);
}
return 0;
}