ODT, WA 60pts 求调校
  • 板块P5350 序列
  • 楼主LengSC
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/6/14 14:01
  • 上次更新2024/6/14 14:03:30
查看原帖
ODT, WA 60pts 求调校
909549
LengSC楼主2024/6/14 14:01

WA on #2 #3 #8 #10

src 如下

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

constexpr ll MOD = 1e9 + 7, N = 3e5 + 2;
ll n, m;

/* ODT */
struct Node_t {
    ll l, r;
    mutable ll v;

    Node_t(const ll &_l, const ll &_r, const ll &_v) : l(_l), r(_r), v(_v) {}
    Node_t() = default;

    bool operator<(const Node_t &b) const { return l < b.l; }
};

set<Node_t> odt;

auto split(ll x) {
    if (x > n) return odt.end();

    auto it = --odt.upper_bound({x, 0, 0});
    if (it->l == x) return it;

    auto l = it->l, r = it->r, v = it->v;
    odt.erase(it);
    odt.emplace(l, x - 1, v);
    return odt.emplace(x, r, v).first;
}

void assign(ll l, ll r, ll v) {
    auto itr = split(r + 1), itl = split(l);
    odt.erase(itl, itr);
    odt.emplace(l, r, v);
}

void add(ll l, ll r, ll v) {
    auto itr = split(r + 1), itl = split(l);
    for (; itl != itr; ++itl) {
        itl->v = (itl->v + v) % MOD;
    }
}

ll sum(ll l, ll r) {
    auto itr = split(r + 1), itl = split(l);
    ll res = 0;
    for (; itl != itr; ++itl) {
        res = (res + itl->v * (itl->r - itl->l + 1)) % MOD;
    }
    return res;
}

Node_t tmp[N], tmp2[N];

void rvrs(ll l, ll r) {
    auto itr = split(r + 1), itl = split(l);
    ll top = 0;
    for (auto it = itl; it != itr; ++it) {
        tmp[++top] = *it;
    }
    odt.erase(itl, itr);
    for (ll i = 1; i <= top; ++i) {
        odt.emplace(l + r - tmp[i].r, l + r - tmp[i].l, tmp[i].v);
    }
}

void copy(ll l1, ll r1, ll l2, ll r2) {
    auto itr1 = split(r1 + 1), itl1 = split(l1);
    ll top = 0;
    for (auto it = itl1; it != itr1; ++it) {
        tmp[++top] = *it;
    }
    auto itr2 = split(r2 + 1), itl2 = split(l2);
    odt.erase(itl2, itr2);
    for (ll i = 1; i <= top; ++i) {
        odt.emplace(tmp[i].l - l1 + l2, tmp[i].r - r1 + r2, tmp[i].v);
    }
}

void swap(ll l1, ll r1, ll l2, ll r2) {
    auto itr1 = split(r1 + 1), itl1 = split(l1);
    ll top = 0, top2 = 0;
    for (auto it = itl1; it != itr1; ++it) {
        tmp[++top] = *it;
    }
    auto itr2 = split(r2 + 1), itl2 = split(l2);
    for (auto it = itl2; it != itr2; ++it) {
        tmp2[++top2] = *it;
    }
    itr1 = split(r1 + 1);
    itl1 = split(l1);
    odt.erase(itl1, itr1);
    itr2 = split(r2 + 1);
    itl2 = split(l2);
    odt.erase(itl2, itr2);
    for (ll i = 1; i <= top; ++i) {
        odt.emplace(tmp[i].l - l1 + l2, tmp[i].r - r1 + r2, tmp[i].v);
    }
    for (ll i = 1; i <= top2; ++i) {
        odt.emplace(tmp2[i].l - l2 + l1, tmp2[i].r - r2 + r1, tmp2[i].v);
    }
}

void print() {
    for (auto it = odt.begin(); it != odt.end() && it->r <= n; ++it) {
        for (ll i = it->l; i <= it->r; ++i) {
            cout << it->v << " ";
        }
    }
}

/* MAIN */
int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);

    cin >> n >> m;

    for (ll i = 1, x; i <= n; ++i) {
        cin >> x;
        odt.emplace(i, i, x);
    }
    odt.emplace(n + 1, n + 1, 0);

    for (ll i = 1, op, l1, r1, l2, r2, v; i <= m; ++i) {
        cin >> op;
        switch (op) {
            case 1:
                cin >> l1 >> r1;
                cout << sum(l1, r1) << endl;
                break;
            case 2:
                cin >> l1 >> r1 >> v;
                assign(l1, r1, v);
                break;
            case 3:
                cin >> l1 >> r1 >> v;
                add(l1, r1, v);
                break;
            case 4:
                cin >> l1 >> r1 >> l2 >> r2;
                copy(l1, r1, l2, r2);
                break;
            case 5:
                cin >> l1 >> r1 >> l2 >> r2;
                swap(l1, r1, l2, r2);
                break;
            case 6:
                cin >> l1 >> r1;
                rvrs(l1, r1);
                break;
        }
    }

    print();

    return 0;
}
2024/6/14 14:01
加载中...