T on #1#2 求调
查看原帖
T on #1#2 求调
666796
Rainsleep楼主2024/1/26 15:53

写的是线段树优化建图后缩点 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;
}```
2024/1/26 15:53
加载中...