社区讨论

开O2就WA了,求助哪里有问题

P7156 [USACO20DEC] Cowmistry P参与者 4已保存回复 6

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
6 条
当前快照
1 份
快照标识符
@lo8mg9t4
此快照首次捕获于
2023/10/27 21:01
2 年前
此快照最后确认于
2023/10/27 21:01
2 年前
查看原帖
CPP
/*
    \  | ^  ^  \
   -- | #    # \
   \_|         \
*/
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <vector>
#define int long long

const int lim = (1ll << 30), N = 1e6 + 10;
const int mod = 1e9 + 7;
const int inv2 = (mod + 1) / 2, inv6 = (mod + 1) / 6;

struct Node {
    int ls, rs, tag, siz;
}tr[N * 33];
int n, k, m;
int tot, rt;
int ans;

void update(int u) {
    tr[u].siz = tr[tr[u].ls].siz + tr[tr[u].rs].siz;
}

void insert(int &u, int x, int y, int l = 0, int r = lim - 1) {
    if (!u) u = ++tot;
    if (x <= l && r <= y) {
        tr[u].siz = (r - l + 1);
        tr[u].tag = 1;
        return ;
    }
    int mid = (l + r) >> 1;
    if (x <= mid) insert(tr[u].ls, x, y, l, mid);
    if (y > mid) insert(tr[u].rs, x, y, mid + 1, r);
    update(u);
}

int Up(int x) {
    return 1 << (32 - __builtin_clz(x));
}

// void merge(std::vector<std::pair<int, int>> a, std::vector<std::pair<int, int>> b) {
    // a.insert(a.end(), b.begin(), b.end());
// }

int C3(int n) {
    return 1ll * n * (n - 1) % mod * (n - 2) % mod * inv6 % mod;
}

int C2(int n) {
    return 1ll * n * (n - 1) % mod * inv2 % mod;
}

int add(int x, int y) {
    return x + y >= mod ? x + y - mod : x + y;
}

int cntm;

std::vector<std::pair<int, int>> doit(int u, int v, int L, int k, int tu, int tv) {
    tu |= tr[u].tag, tv |= tr[v].tag;
    std::vector<std::pair<int, int>> res;
    if (!tu && !u) return {};
    if (tv) return {std::make_pair(k + 1, tu ? L : tr[u].siz)};
    if (!v) return {std::make_pair(0, tu ? L : tr[u].siz)};
    int m = Up(k);
    if (L > m) {
        std::vector<std::pair<int, int>> A = doit(tr[u].ls, tr[v].ls, L / 2, k, tu, tv);
        std::vector<std::pair<int, int>> B = doit(tr[u].rs, tr[v].rs, L / 2, k, tu, tv);
        A.insert(A.end(), B.begin(), B.end());
        return A;
    }
    k -= m / 2;
    std::vector<std::pair<int, int>> A = doit(tr[u].ls, tr[v].rs, L / 2, k, tu, tv);
    for (auto &it : A) {
        it.first = add(it.first, tv ? L / 2 : tr[tr[v].ls].siz);
    }
    std::vector<std::pair<int, int>> B = doit(tr[u].rs, tr[v].ls, L / 2, k, tu, tv);
    for (auto &it : B) {
        it.first = add(it.first, tv ? L / 2 : tr[tr[v].rs].siz);
    }
    A.insert(A.end(), B.begin(), B.end());
    return A;
}

void solve(int u, int l, int r) {
    if (!u) return ;
    if (tr[u].tag) {
        cntm += (r - l + 1) / m;
        return ;
    }
    if (r - l + 1 == m) {
        ans = add(ans, C3(tr[tr[u].ls].siz));
        ans = add(ans, C3(tr[tr[u].rs].siz));
        std::vector<std::pair<int, int>> A = doit(tr[u].ls, tr[u].rs, (r - l + 1) / 2, k - (r - l + 1) / 2, 0, 0);
        std::vector<std::pair<int, int>> B = doit(tr[u].rs, tr[u].ls, (r - l + 1) / 2, k - (r - l + 1) / 2, 0, 0);
        for (auto it : A) {
            ans = add(ans, 1ll * C2(it.first) * it.second % mod);
        }
        for (auto it : B) {
            ans = add(ans, 1ll * C2(it.first) * it.second % mod);
        }
        return ;
    }
    int mid = (l + r) >> 1;
    solve(tr[u].ls, l, mid);
    solve(tr[u].rs, mid + 1, r);
}

signed main() {
    freopen("milk.in", "r", stdin);
    freopen("milk.out", "w", stdout);
    scanf("%lld%lld", &n, &k);
    for (int i = 1; i <= n; ++i) {
        int l, r;
        scanf("%lld%lld", &l, &r);
        insert(rt, l, r);
    }
    m = Up(k);
    solve(rt, 0, lim - 1);
    ans = add(ans, 1ll * cntm * add(2ll * C3(m / 2) % mod, 1ll * C2(k - m / 2 + 1) * m % mod) % mod);
    printf("%lld\n", ans);
    return 0;
}

回复

6 条回复,欢迎继续交流。

正在加载回复...