或者也可以描述为,给定
前言:核心思路参考自 这篇Blog,主要是我太弱了,有点没太看懂这个大佬柿子的精妙推导,于是尝试自己推了一遍,用比较低端的方法也成功推到
一道奇怪的题,最终可以转化为无脑推柿子。
首先借一个题解区的图(图片来自 这篇Blog):
不难发现一个妙妙性质,即在第 点矩形的东西,再化简。前面这里如果还是看不懂可以去翻翻题解区,这里不再重复赘述。令
然后我们令
然后就成功从
xxxxxxxxxx
721
2
3
4
5
6
7
8
9
10
11using namespace std;
12using namespace __gnu_pbds;
13
14mt19937 rnd(random_device{}());
15int rndd(int l, int r){return rnd() % (r - l + 1) + l;}
16bool rnddd(int x){return rndd(1, 100) <= x;}
17
18typedef unsigned int uint;
19typedef unsigned long long unll;
20typedef long long ll;
21typedef long double ld;
22
23
24
25
26
27template< typename T = int >
28inline T read(void);
29
30int N;
31int y[110000];
32int l[110000], r[110000], up[110000];
33ll sum1[110000];
34ll sum2[110000];
35
36int main(){
37 N = read();
38 for(int i = 1; i <= N; ++i){
39 int rx = read() + 1, ry = read() + 1;
40 y[rx] = ry;
41 }l[0] = INT_MAX; r[N + 1] = -1;
42 for(int i = 1; i <= N; ++i)l[i] = min(l[i - 1], y[i]);
43 for(int i = N; i >= 1; --i)r[i] = max(r[i + 1], y[i]);
44 int cur = r[1];
45 for(int i = 1; i <= N; ++i)while(cur && cur >= l[i])up[cur] = i, --cur;
46 for(int i = 1; i <= N; ++i)sum1[i] = (sum1[i - 1] + up[i]) % MOD;
47 for(int i = 1; i <= N; ++i)sum2[i] = (sum2[i - 1] + sum1[i]) % MOD;
48 ll ans(0);
49 for(int i = 1; i <= N; ++i){
50 ans = (ans + ((ll)r[i] - l[i]) * (r[i] - l[i] + 1) / 2ll % MOD * i % MOD) % MOD;
51 ans = (ans - GetSum2(r[i] - 1) + GetSum2(l[i] - 2) + MOD) % MOD;
52 ans = (ans + ((ll)r[i] - l[i] + 1) * GetSum1(l[i] - 1) % MOD) % MOD;
53 }printf("%lld\n", ans);
54 fprintf(stderr, "Time: %.6lf\n", (double)clock() / CLOCKS_PER_SEC);
55 return 0;
56}
57
58template < typename T >
59inline T read(void){
60 T ret(0);
61 short flag(1);
62 char c = getchar();
63 while(c != '-' && !isdigit(c))c = getchar();
64 if(c == '-')flag = -1, c = getchar();
65 while(isdigit(c)){
66 ret *= 10;
67 ret += int(c - '0');
68 c = getchar();
69 }
70 ret *= flag;
71 return ret;
72}
update-2022_11_03 初稿