社区讨论
开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 条回复,欢迎继续交流。
正在加载回复...