写的是线段树优化建图后缩点 dp,别的 oj 上都过了。
怎么回事呢。
// #pragma GCC optimize(1)
// #pragma GCC optimize(2)
// #pragma GCC optimize(3)
// #pragma GCC optimize("Ofast", "inline", "-ffast-math")
// #pragma GCC target("avx,sse2,sse3,sse4,mmx")
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
#define int LL
typedef vector<int> vec;
typedef pair<int, int> PII;
#define x first
#define r second
#define epb emplace_back
#define mod(x, y) ((x + y) % p)
#define mul(x, y) ((x) * (y) % p)
const int maxn = 2e6 + 10, p = 1e9 + 7;
PII it[maxn];
int id[maxn], sc, pos[maxn], res;
bitset<maxn> ins;
vec scc[maxn], e[maxn];
struct inter {
int l, r;
inter () { l = LLONG_MAX, r = -l; }
} f[maxn], st[maxn];
inline inter operator+ (const inter a, const inter b) {
inter c;
c.l = min(a.l, b.l), c.r = max(a.r, b.r);
return c;
}
inline void build(int u, int l, int r) {
st[u].l = l, st[u].r = r;
if(l == r) return pos[l] = u, void();
int mid = l + r >> 1;
e[u].epb(u << 1), build(u << 1, l, mid);
e[u].epb(u << 1 | 1), build(u << 1 | 1, mid + 1, r);
return ;
}
inline void ade(int u, int l, int r, int L, int R, int p) {
if(L <= l && r <= R) return e[p].epb(u), void();
int mid = l + r >> 1;
if(L <= mid) ade(u << 1, l, mid, L, R, p);
if(R > mid) ade(u << 1 | 1, mid + 1, r, L, R, p);
return ;
}
int ts, dfn[maxn], low[maxn], n, s[maxn], t;
inline void tarjan(int u) {
dfn[u] = low[u] = ++ ts, ins[u] = 1, s[++ t] = u;
for(int v : e[u]) {
if(!dfn[v]) {
tarjan(v);
low[u] = min(low[u], low[v]);
} else if(ins[v]) low[u] = min(low[u], dfn[v]);
}
if(dfn[u] == low[u]) {
++ sc; int y;
do {
id[y = s[t -- ]] = sc, ins[y] = 0;
f[sc] = f[sc] + st[y];
scc[sc].epb(y);
} while(y ^ u);
}
return ;
}
signed main() {
ios :: sync_with_stdio(false);
cin.tie(0), cout.tie(0);
cin >> n;
build(1, 1, n);
for(int i = 1; i <= n; ++ i) cin >> it[i].x >> it[i].r;
it[n + 1].x = LLONG_MAX;
for(int i = 1; i <= n; ++ i) {
int l = lower_bound(it + 1, it + 1 + n, make_pair(it[i].x - it[i].r, -1ll)) - it;
int r = upper_bound(it + 1, it + 2 + n, make_pair(it[i].x + it[i].r, LLONG_MAX)) - it - 1;
if(l ^ r) ade(1, 1, n, l, r, pos[i]);
}
for(int i = 1; i <= pos[n]; ++ i)
if(!dfn[i]) tarjan(i);
for(int i = sc; i; -- i) {
bitset<maxn> vis;
vis[i] = 1;
for(int u : scc[i])
for(int v : e[u])
if(!vis[id[v]]) f[i] = f[i] + f[id[v]];
}
for(int i = 1; i <= n; ++ i) res = mod(res, mul(i, (f[id[pos[i]]].r - f[id[pos[i]]].l + 1) % p));
cout << res << '\n';
return 0;
}```