[BZOJ 3745] [COCI 2015] Norma
Description
给定一个正整数序列 \(a_1,a_2,\cdots,a_n\),求
\]
Input
第 \(1\) 行,一个整数 \(n\);
第 \(2\dots n+1\) 行,每行一个整数表示序列 \(a\)。
Output
输出答案对 \(10^9\) 取模后的结果。
Sample Input
4
2
4
1
4
Sample Output
109
HINT
\(n \le 500000,1 \le a_i \le 10^8\)
Solution
CDQ分治,从右往左枚举 \([l,mid]\) 的每个点 \(i\),设 \([i,mid]\) 的最小值为 \(mn\),最大值为 \(mx\),同时在 \([mid+1,r]\) 中维护两个指针 \(a,b\),满足 \(\min[mid+1,a]\ge mn,\max[mid+1,b]\le mx\)。假设 \(a<b\),那么 \([mid+1,r]\) 就被分成了三块,我们分别考虑 \(j\) 在每个块内的答案:
- 若 \(mid<j\le a\),
ans&=&mn\cdot mx\sum_{j=mid+1}^{a}(j-i+1)\\
&=&\frac{(a+mid-2i+3)(a-mid)}{2}
\end{eqnarray}
\]
- 若 \(a< j \le b\),
ans&=&mx\cdot\sum_{j=a+1}^b(j-i+1)\min[a+1,j]\\
&=&mx\left(\sum_{j=a+1}^bj\cdot\min[a+1,j]-(i-1)\sum_{j=a+1}^b\min[a+1,j]\right)\\
&=&mx\left(\sum_{j=a+1}^bj\cdot\min[1,j]-(i-1)\sum_{j=a+1}^b\min[1,j]\right)
\end{eqnarray}
\]
- 若 \(b< j\le r\),
ans&=&\sum_{j=b+1}^r(j-i+1)\min[b+1,j]\max[b+1,j]\\
&=&\sum_{j=b+1}^rj\cdot\min[b+1,j]\max[b+1,j]-(i-1)\sum_{j=b+1}^r\min[b+1,j]\max[b+1,j]\\
&=&\sum_{j=b+1}^rj\cdot\min[1,j]\max[1,j]-(i-1)\sum_{j=b+1}^r\min[1,j]\max[1,j]
\end{eqnarray}
\]
其中 \(\sum_{j=a+1}^bj\cdot\min[1,j]\),\(\sum_{j=a+1}^b\min[1,j]\),\(\sum_{j=b+1}^rj\cdot\min[1,j]\max[1,j]\),\(\sum_{j=b+1}^r\min[1,j]\max[1,j]\) 可以预处理前缀和得到。
Code
#include <cstdio>
#include <algorithm>
using std::max; using std::min;
const int N = 500005, mod = 1000000000;
int a[N], n, s1[N], s2[N], s3[N], s4[N], s5[N], s6[N], ans;
int read() {
int x = 0; char c = getchar();
while (c < '0' || c > '9') c = getchar();
while (c >= '0' && c <= '9') x = (x << 3) + (x << 1) + (c ^ 48), c = getchar();
return x;
}
void solve(int l, int r) {
if (l == r) { ans = (ans + 1LL * a[l] * a[l]) % mod; return; }
int mid = (l + r) >> 1, mn = mod, mx = 0, x;
solve(l, mid), solve(mid + 1, r);
for (int i = mid + 1; i <= r; ++i) {
mn = min(mn, a[i]), mx = max(mx, a[i]);
s1[i] = (s1[i - 1] + 1LL * i * mn) % mod;
if ((s2[i] = s2[i - 1] + mn) >= mod) s2[i] -= mod;
s3[i] = (s3[i - 1] + 1LL * i * mx) % mod;
if ((s4[i] = s4[i - 1] + mx) >= mod) s4[i] -= mod;
s5[i] = (s5[i - 1] + 1LL * i * mn % mod * mx) % mod;
s6[i] = (s6[i - 1] + 1LL * mn * mx) % mod;
}
mn = mod, mx = 0;
for (int i = mid, j = mid, k = mid; i >= l; --i) {
mn = min(mn, a[i]), mx = max(mx, a[i]);
while (j < r && a[j] >= mn && a[j + 1] >= mn) ++j;
while (k < r && a[k] <= mx && a[k + 1] <= mx) ++k;
if ((x = min(j, k))) ans = (ans + 1LL * mn * mx % mod * (((x + mid - i - i + 3LL) * (x - mid) >> 1) % mod)) % mod;
if (j < k) ans = (ans + ((s1[k] - s1[j]) - 1LL * (i - 1) * (s2[k] - s2[j])) % mod * mx) % mod;
if (j > k) ans = (ans + ((s3[j] - s3[k]) - 1LL * (i - 1) * (s4[j] - s4[k])) % mod * mn) % mod;
if ((x = max(j, k)) < r) ans = (ans + s5[r] - s5[x] - 1LL * (i - 1) * (s6[r] - s6[x])) % mod;
}
}
int main() {
n = read();
for (int i = 1; i <= n; ++i) a[i] = read();
solve(1, n);
if (ans < 0) ans += mod;
printf("%d\n", ans);
return 0;
}
[BZOJ 3745] [COCI 2015] Norma的更多相关文章
- BZOJ 3881 COCI 2015 Divljak
题面 Description Tom有n个字符串S1,S2...Sn,Jerry有一个字符串集合T,一开始集合是空的. 接下来会发生q个操作,操作有两种形式: "1 P",Jerr ...
- bzoj 3743 [ Coci 2015 ] Kamp —— 树形DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3743 一开始想到了树形DP,处理一下子树中的最小值,向上的最小值,以及子树中的最长路和向上的 ...
- [LOJ 2134][UOJ 132][BZOJ 4200][NOI 2015]小园丁与老司机
[LOJ 2134][UOJ 132][BZOJ 4200][NOI 2015]小园丁与老司机 题意 给定平面上的 \(n\) 个整点 \((x_i,y_i)\), 一共有两个问题. 第一个问题是从原 ...
- [LOJ 2133][UOJ 131][BZOJ 4199][NOI 2015]品酒大会
[LOJ 2133][UOJ 131][BZOJ 4199][NOI 2015]品酒大会 题意 给定一个长度为 \(n\) 的字符串 \(s\), 对于所有 \(r\in[1,n]\) 求出 \(s\ ...
- [BZOJ 3992] [SDOI 2015] 序列统计(DP+原根+NTT)
[BZOJ 3992] [SDOI 2015] 序列统计(DP+原根+NTT) 题面 小C有一个集合S,里面的元素都是小于质数M的非负整数.他用程序编写了一个数列生成器,可以生成一个长度为N的数列,数 ...
- [BZOJ 3930] [CQOI 2015]选数(莫比乌斯反演+杜教筛)
[BZOJ 3930] [CQOI 2015]选数(莫比乌斯反演+杜教筛) 题面 我们知道,从区间\([L,R]\)(L和R为整数)中选取N个整数,总共有\((R-L+1)^N\)种方案.求最大公约数 ...
- BZOJ 3745: [Coci2015]Norma(分治)
题意 给定一个正整数序列 \(a_1, a_2, \cdots, a_n\) ,求 \[ \sum_{i=1}^{n} \sum_{j=i}^{n} (j - i + 1) \min(a_i,a_{i ...
- bzoj 3745 [Coci2015]Norma——序列分治
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3745 如果分治,就能在本层仅算过 mid 的区间了. 可以从中间到左边地遍历左边,给右边两个 ...
- bzoj 3745: [Coci2015]Norma
Description Solution 考虑分治: 我们要统计跨越 \(mid\) 的区间的贡献 分最大值和最小值所在位置进行讨论: 设左边枚举到了 \(i\),左边 \([i,mid]\) 的最大 ...
随机推荐
- node处理表单文件,获取formdata的数据
参考文章:https://blog.csdn.net/a895458278/article/details/48055143# 应用: formidable使用: 原生的node.js在处理客户端以P ...
- float与double
对数值类型的细节了解在大学里就是一带而过,自己始终也没好好看过.这是在csdn上看到的一篇文章,挺好的,记录下来. https://blog.csdn.net/Demon__Hunter/articl ...
- iOS----------弹窗动画
- (void)animationAlert:(UIView *)view { CAKeyframeAnimation *popAnimation = [CAKeyframeAnimation ani ...
- Flutter路由的跳转、动画与传参(最简单)
跳转 命名路由 在文件构建时先设置路由参数: new MaterialApp( // 代码 routes: { "secondPage":(BuildContext context ...
- linux Page cache和buffer cache正解
Page cache和buffer cache一直以来是两个比较容易混淆的概念,在网上也有很多人在争辩和猜想这两个cache到底有什么区别,讨论到最后也一直没有一个统一和正确的结论,在我工作的这一段时 ...
- KAPTCHA验证码使用步骤
使用kaptcha可以方便的配置: · 验证码的字体 · 验证码字体的大小 · 验证码字体的字体颜色 · 验证码内容的范围(数字,字母,中文汉字!) · 验证码图片的大小,边框,边框粗细,边框颜色 · ...
- Django 简介
一 MVC 与 MTV 模型 (1)MVC C: controller 控制器(url分发和视图函数) V: 存放html文件 M: model:数据库操作 Web服务器开发领域里著名的MVC模式 ...
- Hive:ORC File Format存储格式详解
一.定义 ORC File,它的全名是Optimized Row Columnar (ORC) file,其实就是对RCFile做了一些优化. 据官方文档介绍,这种文件格式可以提供一种高效的方法来存储 ...
- javaScript判断手机型号
window.onload = function () { alert("1"); var u = navigator.userAgent; if (u.indexOf('Andr ...
- web开发-Django博客系统
项目界面图片预览 项目代码github地址 项目完整流程 项目流程: 1 搞清楚需求(产品经理) (1) 基于用户认证组件和Ajax实现登录验证(图片验证码) (2) 基于forms组件和Ajax实现 ...