Description

给定一个正整数序列 \(a_1,a_2,\cdots,a_n\),求

\[\sum_{i=1}^n\sum_{j=i}^n(j-i+1)\min(a_i,a_{i+1},\cdots,a_j)\max(a_i,a_{i+1},\cdots,a_j)
\]

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\),

\[\begin{eqnarray}
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\),

\[\begin{eqnarray}
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\),

\[\begin{eqnarray}
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的更多相关文章

  1. BZOJ 3881 COCI 2015 Divljak

    题面 Description Tom有n个字符串S1,S2...Sn,Jerry有一个字符串集合T,一开始集合是空的. 接下来会发生q个操作,操作有两种形式: "1 P",Jerr ...

  2. bzoj 3743 [ Coci 2015 ] Kamp —— 树形DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3743 一开始想到了树形DP,处理一下子树中的最小值,向上的最小值,以及子树中的最长路和向上的 ...

  3. [LOJ 2134][UOJ 132][BZOJ 4200][NOI 2015]小园丁与老司机

    [LOJ 2134][UOJ 132][BZOJ 4200][NOI 2015]小园丁与老司机 题意 给定平面上的 \(n\) 个整点 \((x_i,y_i)\), 一共有两个问题. 第一个问题是从原 ...

  4. [LOJ 2133][UOJ 131][BZOJ 4199][NOI 2015]品酒大会

    [LOJ 2133][UOJ 131][BZOJ 4199][NOI 2015]品酒大会 题意 给定一个长度为 \(n\) 的字符串 \(s\), 对于所有 \(r\in[1,n]\) 求出 \(s\ ...

  5. [BZOJ 3992] [SDOI 2015] 序列统计(DP+原根+NTT)

    [BZOJ 3992] [SDOI 2015] 序列统计(DP+原根+NTT) 题面 小C有一个集合S,里面的元素都是小于质数M的非负整数.他用程序编写了一个数列生成器,可以生成一个长度为N的数列,数 ...

  6. [BZOJ 3930] [CQOI 2015]选数(莫比乌斯反演+杜教筛)

    [BZOJ 3930] [CQOI 2015]选数(莫比乌斯反演+杜教筛) 题面 我们知道,从区间\([L,R]\)(L和R为整数)中选取N个整数,总共有\((R-L+1)^N\)种方案.求最大公约数 ...

  7. 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 ...

  8. bzoj 3745 [Coci2015]Norma——序列分治

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3745 如果分治,就能在本层仅算过 mid 的区间了. 可以从中间到左边地遍历左边,给右边两个 ...

  9. bzoj 3745: [Coci2015]Norma

    Description Solution 考虑分治: 我们要统计跨越 \(mid\) 的区间的贡献 分最大值和最小值所在位置进行讨论: 设左边枚举到了 \(i\),左边 \([i,mid]\) 的最大 ...

随机推荐

  1. #WEB安全基础 : HTML/CSS | 0x8CSS进阶

    你以为自己学这么点CSS就厉害了? 学点新东西吧,让你的网页更漂亮 我们只需要用到图片和网页   这是index.html的代码 <html> <head> <title ...

  2. SuperMap iClient 如何使用 WMTS 地图服务(转载)

    原文链接: WMTS服务初步理解与读取 https://blog.csdn.net/supermapsupport/article/details/76806670 SuperMap iClient ...

  3. Linux系统下 MySQL 安装 指南(5.7和8.0 版本)

    一. 准备工作 1 删除本地centos7中的mariadb: 查看系统中是否已安装 mariadb 服务: rpm -qa | grep mariadb 或 yum list installed | ...

  4. Asp.net mvc 项目返回Json

    因mvc控制器返回类型JsonResult 在处理对象转JSON的时候,对日期的格式化处理并不太符合要求,所以重新继承抽象类ActionResult使用Newtonsoft.Json来系列化 usin ...

  5. iOS 设置View阴影

    iOS 设置View投影 需要设置 颜色 阴影半径 等元素 UIView *shadowView = [[UIView alloc] init]; shadowView.frame = CGRectM ...

  6. LeetCode算法题-Heaters(Java实现)

    这是悦乐书的第239次更新,第252篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第106题(顺位题号是475).冬天来了!您在比赛期间的第一份工作是设计一个固定温暖半径 ...

  7. jenkins安装详细教程

    一.jenkins简介 jenkins是一个开源的软件项目,是基于java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能. 1.持续的软件版本 ...

  8. centos7源码包安装Mongodb,并设置开机自启动

    1.下载源码包 curl -O https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.2.12.tgz 2.解压 放到 /usr/local/ ...

  9. Java 8 新特性7-方法引用、继承

    (原) 方法引用: 方法引用有4种: 1.静态方法引用:类名::静态方法名 在java中,对集合的排序,我们常用java提供的 Collections.sort(List<T> list, ...

  10. jenkins乱码解决问题

    1.jenkins控制台线上乱码解决 系统管理——系统设置,添加编码环境变量 zh.CH.UTF-8 2.java启动后,tomcat日志显示乱码,原因是环境变量没有带过去,因此shell脚本头部需要 ...