結果
| 問題 | 
                            No.255 Splarrraaay スプラーレェーーイ
                             | 
                    
| コンテスト | |
| ユーザー | 
                             lam6er
                         | 
                    
| 提出日時 | 2025-04-15 22:43:45 | 
| 言語 | C++17  (gcc 13.3.0 + boost 1.87.0)  | 
                    
| 結果 | 
                             
                                TLE
                                 
                             
                            
                         | 
                    
| 実行時間 | - | 
| コード長 | 3,325 bytes | 
| コンパイル時間 | 4,618 ms | 
| コンパイル使用メモリ | 207,580 KB | 
| 実行使用メモリ | 23,312 KB | 
| 最終ジャッジ日時 | 2025-04-15 22:45:34 | 
| 合計ジャッジ時間 | 27,544 ms | 
| 
                            ジャッジサーバーID (参考情報)  | 
                        judge5 / judge4 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| other | TLE * 1 -- * 9 | 
ソースコード
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll MOD = 1e18 + 9;
struct Interval {
    ll end;
    int team;
    ll thickness;
};
map<ll, Interval> intervals;
void split(ll x) {
    auto it = intervals.upper_bound(x);
    if (it != intervals.begin()) {
        --it;
        ll start = it->first;
        Interval current = it->second;
        if (current.end >= x) {
            intervals.erase(it);
            intervals[start] = {x - 1, current.team, current.thickness};
            intervals[x] = {current.end, current.team, current.thickness};
        }
    }
}
int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    ll N;
    int Q;
    cin >> N >> Q;
    intervals[0] = {N - 1, 0, 0};
    vector<ll> bonus(6, 0);
    while (Q--) {
        int x;
        ll l, r;
        cin >> x >> l >> r;
        if (x == 0) { // Bonus query
            vector<ll> sum(6, 0);
            auto it = intervals.upper_bound(r);
            while (it != intervals.begin()) {
                --it;
                ll start = it->first;
                Interval current = it->second;
                if (current.end < l) break;
                ll overlap_start = max(start, l);
                ll overlap_end = min(current.end, r);
                if (overlap_start > overlap_end) continue;
                ll len = overlap_end - overlap_start + 1;
                if (current.team >= 1 && current.team <= 5) {
                    sum[current.team] += len * current.thickness;
                }
            }
            ll max_sum = 0;
            int count = 0;
            int max_team = -1;
            for (int i = 1; i <= 5; ++i) {
                if (sum[i] > max_sum) {
                    max_sum = sum[i];
                    count = 1;
                    max_team = i;
                } else if (sum[i] == max_sum) {
                    count++;
                }
            }
            if (count == 1) {
                bonus[max_team] = (bonus[max_team] + max_sum) % MOD;
            }
        } else { // Painting operation (team x)
            int team = x;
            split(l);
            split(r + 1);
            auto it_l = intervals.lower_bound(l);
            auto it_r = intervals.upper_bound(r);
            vector<pair<ll, Interval>> to_update;
            for (auto it = it_l; it != it_r;) {
                to_update.push_back({it->first, it->second});
                it = intervals.erase(it);
            }
            for (auto& [start, current] : to_update) {
                if (current.team == team) {
                    current.thickness++;
                } else {
                    current.team = team;
                    current.thickness = 1;
                }
                intervals[start] = current;
            }
        }
    }
    vector<ll> total(6, 0);
    for (auto& [start, current] : intervals) {
        if (current.team >= 1 && current.team <= 5) {
            ll len = current.end - start + 1;
            total[current.team] = (total[current.team] + len * current.thickness) % MOD;
        }
    }
    for (int i = 1; i <= 5; ++i) {
        total[i] = (total[i] + bonus[i]) % MOD;
    }
    cout << total[1] << " " << total[2] << " " << total[3] << " " << total[4] << " " << total[5] << endl;
    return 0;
}
            
            
            
        
            
lam6er