Solution -「COCI 2014-2015 #2」「洛谷 P6406」Norma
\(\mathcal{Description}\)
Link.
给定 \(\{a_n\}\),求:
\]
答案对 \(10^9\) 取模。
\(\mathcal{Solution}\)
挺可爱的一道题 w。
静态序列计数问题,可以考虑分治:对于 \([l,r]\)(\(l<r\)),令分割点 \(p=\lfloor\frac{l+r}2\rfloor\),对满足左端点在 \([l,p]\),右端点在 \((p,r]\) 的区间进行计算,然后递归两个区间继续求解。
对于本题,可以枚举区间左端点 \(i=p,p-1,\cdots,l\),记 \(s=\min_{u=i}^p\{a_u\}\),\(t=\max_{u=i}^p\{a_u\}\),\(j=\max_{u\in(p,r]}\{u|\min_{v=i}^j\{a_v\}=s\}\),\(k=\max_{u\in(p,r]}\{u|\max_{v=i}^j\{a_v\}=t\}\),只讨论 \(j\le k\),发现对于将要计数的区间 \([i,x]\),分三种情况:
\(x\in(p,j]\):最小值、最大值都在 \([l,p]\) 中取到,那么只需要关心 \(x\) 的位置,故此情况对答案的贡献为:
\[pq\sum_{x\in(p,j]}(x-i+1)
\]\(x\in(j,k]\):最大值在 \([l,p]\) 中取到,而最小值会在 \((p,x]\) 中取到,则要求:
\[q\sum_{x\in(j,k]}(x-i+1)\min_{u=p+1}^x\{a_u\}
\]求和内是一个距离 \(\times\) 权值的形式,尝试预处理出值的前缀和和下标 \(\times\) 值的前缀和,就能 \(\mathcal O(1)\) 计算了,这里略过,详见代码。
\(x\in(k,r]\):最小值、最大值都在 \((p,x]\) 中取到,类似地求:
\[\sum_{x\in(k,r]}(x-i+1)\min_{u=p+1}^x\{a_u\}\max_{u=p+1}^x\{a_u\}
\]仍然预处理出两种前缀和,\(\mathcal O(1)\) 计算。
综上,在分治的 \(\mathcal O(n\log n)\) 的时间内解决本题。
\(\mathcal{Code}\)
/* Clearink */
#include <cstdio>
inline int rint () {
int x = 0; char s = getchar ();
for ( ; s < '0' || '9' < s; s = getchar () );
for ( ; '0' <= s && s <= '9'; s = getchar () ) x = x * 10 + ( s ^ '0' );
return x;
}
const int MAXN = 5e5, MOD = 1e9;
int n, a[MAXN + 5], ans;
int smx[MAXN + 5], vmx[MAXN + 5];
int smn[MAXN + 5], vmn[MAXN + 5];
int sxn[MAXN + 5], vxn[MAXN + 5];
inline void chkmin ( int& a, const int b ) { b < a && ( a = b, 0 ); }
inline void chkmax ( int& a, const int b ) { a < b && ( a = b, 0 ); }
inline int mul ( const long long a, const int b ) { return a * b % MOD; }
inline int sub ( int a, const int b ) { return ( a -= b ) < 0 ? a + MOD : a; }
inline int add ( int a, const int b ) { return ( a += b ) < MOD ? a : a - MOD; }
inline void addeq ( int& a, const int b ) { ( a += b ) >= MOD && ( a -= MOD, 0 ); }
inline int sum ( const int l, const int r ) {
return r < l ? 0 : ( ( l + r ) * ( r - l + 1ll ) >> 1 ) % MOD;
}
inline void solve ( const int l, const int r ) {
if ( l == r ) return addeq ( ans, mul ( a[l], a[l] ) );
int mid = l + r >> 1;
smx[mid] = vmx[mid] = smn[mid] = vmn[mid] = sxn[mid] = vxn[mid] = 0;
for ( int i = mid + 1, mn = a[mid + 1], mx = a[mid + 1];
i <= r; ++i, chkmin ( mn, a[i] ), chkmax ( mx, a[i] ) ) {
vmx[i] = add ( vmx[i - 1], mx ),
smx[i] = add ( smx[i - 1], mul ( i - mid, mx ) );
vmn[i] = add ( vmn[i - 1], mn ),
smn[i] = add ( smn[i - 1], mul ( i - mid, mn ) );
vxn[i] = add ( vxn[i - 1], mul ( mn, mx ) ),
sxn[i] = add ( sxn[i - 1], mul ( i - mid, mul ( mn, mx ) ) );
}
for ( int i = mid, mn = a[i], mx = a[i], j = mid + 1, k = mid + 1;
i >= l; --i, chkmin ( mn, a[i] ), chkmax ( mx, a[i] ) ) {
for ( ; j <= r && mn <= a[j]; ++j );
for ( ; k <= r && a[k] <= mx; ++k );
int p = j < k ? j : k, q = j ^ k ^ p; // [mid+1,p),[p,q),[q,r].
addeq ( ans, mul ( mul ( mn, mx ), sum ( mid + 2 - i, p - i ) ) );
if ( j <= k ) { // max is constant while min will change.
addeq ( ans, mul ( mx, add (
mul ( mid - i + 1, sub ( vmn[k - 1], vmn[j - 1] ) ),
sub ( smn[k - 1], smn[j - 1] ) ) ) );
} else { // min is constant while max will change.
addeq ( ans, mul ( mn, add (
mul ( mid - i + 1, sub ( vmx[j - 1], vmx[k - 1] ) ),
sub ( smx[j - 1], smx[k - 1] ) ) ) );
}
addeq ( ans, add (
mul ( mid - i + 1, sub ( vxn[r], vxn[q - 1] ) ),
sub ( sxn[r], sxn[q - 1] ) ) );
}
solve ( l, mid ), solve ( mid + 1, r );
}
int main () {
n = rint ();
for ( int i = 1; i <= n; ++i ) a[i] = rint ();
solve ( 1, n );
printf ( "%d\n", ans );
return 0;
}
Solution -「COCI 2014-2015 #2」「洛谷 P6406」Norma的更多相关文章
- 「区间DP」「洛谷P1043」数字游戏
「洛谷P1043」数字游戏 日后再写 代码 /*#!/bin/sh dir=$GEDIT_CURRENT_DOCUMENT_DIR name=$GEDIT_CURRENT_DOCUMENT_NAME ...
- Solution -「JSOI 2019」「洛谷 P5334」节日庆典
\(\mathscr{Description}\) Link. 给定字符串 \(S\),求 \(S\) 的每个前缀的最小表示法起始下标(若有多个,取最小的). \(|S|\le3\time ...
- Solution -「洛谷 P4372」Out of Sorts P
\(\mathcal{Description}\) OurOJ & 洛谷 P4372(几乎一致) 设计一个排序算法,设现在对 \(\{a_n\}\) 中 \([l,r]\) 内的元素排 ...
- Solution -「POI 2010」「洛谷 P3511」MOS-Bridges
\(\mathcal{Description}\) Link.(洛谷上这翻译真的一言难尽呐. 给定一个 \(n\) 个点 \(m\) 条边的无向图,一条边 \((u,v,a,b)\) 表示从 ...
- Solution -「APIO 2016」「洛谷 P3643」划艇
\(\mathcal{Description}\) Link & 双倍经验. 给定 \(n\) 个区间 \([a_i,b_i)\)(注意原题是闭区间,这里只为方便后文描述),求 \(\ ...
- Solution -「POI 2014」「洛谷 P5904」HOT-Hotels 加强版
\(\mathcal{Description}\) Link. 给定一棵 \(n\) 个点的树,求无序三元组 \((u,v,w)\) 的个数,满足其中任意两点树上距离相等. \(n\le1 ...
- Solution -「JLOI 2015」「洛谷 P3262」战争调度
\(\mathcal{Description}\) Link. 给定一棵 \(n\) 层的完全二叉树,你把每个结点染成黑色或白色,满足黑色叶子个数不超过 \(m\).对于一个叶子 \(u\), ...
- Solution -「CTS 2019」「洛谷 P5404」氪金手游
\(\mathcal{Description}\) Link. 有 \(n\) 张卡牌,第 \(i\) 张的权值 \(w_i\in\{1,2,3\}\),且取值为 \(k\) 的概率正比于 \ ...
- Solution -「CEOI 2017」「洛谷 P4654」Mousetrap
\(\mathscr{Description}\) Link. 在一个含 \(n\) 个结点的树形迷宫中,迷宫管理者菈米莉丝和一只老鼠博弈.老鼠初始时在结点 \(y\),有且仅有结点 \(x\ ...
随机推荐
- PowerShell 管道符之Select的使用方法【二】
这次讲解Select中的第二个方法:String 在我们的ISE编辑器中输入如下命令 Select-String - 可以了解到,原来这是正则表达式,它提供了一些额外的正则方法.具体如何使用,可以自行 ...
- HTTP 408 问题 - Koa body parser
环境描述: 1.nodejs 作为 api 服务器,转发请求给 nginx 2.用 curl 测试,返回 408 找了很久没有找到原因,发现了一篇文章: https://lujunda.cn/2016 ...
- testng.xml 执行多个测试用例
1.在工程名字上点击右键,点击[New]-->[File] 2.在弹出的[New File]对话框中的[File name]输入[testng.xml],点击[Finish]即创建了一个test ...
- 《剑指offer》面试题53 - I. 在排序数组中查找数字 I
问题描述 统计一个数字在排序数组中出现的次数. 示例 1: 输入: nums = [5,7,7,8,8,10], target = 8 输出: 2 示例 2: 输入: nums = [5,7,7,8, ...
- Three.js之绘制物体的边框及修改lineWidth
本博文主要记录如何使用three.js绘制物体的边框及修改其lineWidth.three.js是个技术点比较多,查询资料又比较少的框架,单单就这个修改lineWidth就是一个坑.先放一个动态的效果 ...
- [µC/GUI 学习]µC/GUI移植
一.什么是µC/GUI µC/GUI为任何需要图形显示器的嵌入式应用提供了一种灵活的图形用户界面(GUI).µC/GUI允许软件工程师在使用了LCD显示器的产品上增加美轮美奂的用户界面,从简单的2D黑 ...
- linux中链接错误的时候,快速找到缺失的符号在哪个库中
编译一个opencv程序,链接的时候出现大量的如下错误: /home/admin/opencv/opencv-master/modules/imgproc/src/color_lab.cpp:23: ...
- 【简记】SpringBoot禁用Swagger
楔子 Swagger 是 Java Web 开发中常用的接口文档生成类库,在开发和前后端联调时使用它来模拟接口调用能提高开发效率.但是,在生产环境可能并不需要它,一个原因是启用它会延长程序启动时间(动 ...
- Nginx配置文件nginx.conf有哪些属性模块?
worker_processes 1: # worker进程的数量 events { # 事件区块开始 worker_connections 1024: # 每个worker进程支持的最大连接数 } ...
- ApacheCN 深度学习译文集 20210112 更新
新增了六个教程: TensorFlow 2 和 Keras 高级深度学习 零.前言 一.使用 Keras 入门高级深度学习 二.深度神经网络 三.自编码器 四.生成对抗网络(GAN) 五.改进的 GA ...