\(\mathcal{Description}\)

  Link.

  给定 \(\{a_n\}\),求:

\[\sum_{i=1}^n\sum_{j=i}^n(j-i+1)\min_{k=i}^j\{a_k\}\max_{k=i}^j\{a_k\}
\]

  答案对 \(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}\)

  1. /* Clearink */
  2. #include <cstdio>
  3. inline int rint () {
  4. int x = 0; char s = getchar ();
  5. for ( ; s < '0' || '9' < s; s = getchar () );
  6. for ( ; '0' <= s && s <= '9'; s = getchar () ) x = x * 10 + ( s ^ '0' );
  7. return x;
  8. }
  9. const int MAXN = 5e5, MOD = 1e9;
  10. int n, a[MAXN + 5], ans;
  11. int smx[MAXN + 5], vmx[MAXN + 5];
  12. int smn[MAXN + 5], vmn[MAXN + 5];
  13. int sxn[MAXN + 5], vxn[MAXN + 5];
  14. inline void chkmin ( int& a, const int b ) { b < a && ( a = b, 0 ); }
  15. inline void chkmax ( int& a, const int b ) { a < b && ( a = b, 0 ); }
  16. inline int mul ( const long long a, const int b ) { return a * b % MOD; }
  17. inline int sub ( int a, const int b ) { return ( a -= b ) < 0 ? a + MOD : a; }
  18. inline int add ( int a, const int b ) { return ( a += b ) < MOD ? a : a - MOD; }
  19. inline void addeq ( int& a, const int b ) { ( a += b ) >= MOD && ( a -= MOD, 0 ); }
  20. inline int sum ( const int l, const int r ) {
  21. return r < l ? 0 : ( ( l + r ) * ( r - l + 1ll ) >> 1 ) % MOD;
  22. }
  23. inline void solve ( const int l, const int r ) {
  24. if ( l == r ) return addeq ( ans, mul ( a[l], a[l] ) );
  25. int mid = l + r >> 1;
  26. smx[mid] = vmx[mid] = smn[mid] = vmn[mid] = sxn[mid] = vxn[mid] = 0;
  27. for ( int i = mid + 1, mn = a[mid + 1], mx = a[mid + 1];
  28. i <= r; ++i, chkmin ( mn, a[i] ), chkmax ( mx, a[i] ) ) {
  29. vmx[i] = add ( vmx[i - 1], mx ),
  30. smx[i] = add ( smx[i - 1], mul ( i - mid, mx ) );
  31. vmn[i] = add ( vmn[i - 1], mn ),
  32. smn[i] = add ( smn[i - 1], mul ( i - mid, mn ) );
  33. vxn[i] = add ( vxn[i - 1], mul ( mn, mx ) ),
  34. sxn[i] = add ( sxn[i - 1], mul ( i - mid, mul ( mn, mx ) ) );
  35. }
  36. for ( int i = mid, mn = a[i], mx = a[i], j = mid + 1, k = mid + 1;
  37. i >= l; --i, chkmin ( mn, a[i] ), chkmax ( mx, a[i] ) ) {
  38. for ( ; j <= r && mn <= a[j]; ++j );
  39. for ( ; k <= r && a[k] <= mx; ++k );
  40. int p = j < k ? j : k, q = j ^ k ^ p; // [mid+1,p),[p,q),[q,r].
  41. addeq ( ans, mul ( mul ( mn, mx ), sum ( mid + 2 - i, p - i ) ) );
  42. if ( j <= k ) { // max is constant while min will change.
  43. addeq ( ans, mul ( mx, add (
  44. mul ( mid - i + 1, sub ( vmn[k - 1], vmn[j - 1] ) ),
  45. sub ( smn[k - 1], smn[j - 1] ) ) ) );
  46. } else { // min is constant while max will change.
  47. addeq ( ans, mul ( mn, add (
  48. mul ( mid - i + 1, sub ( vmx[j - 1], vmx[k - 1] ) ),
  49. sub ( smx[j - 1], smx[k - 1] ) ) ) );
  50. }
  51. addeq ( ans, add (
  52. mul ( mid - i + 1, sub ( vxn[r], vxn[q - 1] ) ),
  53. sub ( sxn[r], sxn[q - 1] ) ) );
  54. }
  55. solve ( l, mid ), solve ( mid + 1, r );
  56. }
  57. int main () {
  58. n = rint ();
  59. for ( int i = 1; i <= n; ++i ) a[i] = rint ();
  60. solve ( 1, n );
  61. printf ( "%d\n", ans );
  62. return 0;
  63. }

Solution -「COCI 2014-2015 #2」「洛谷 P6406」Norma的更多相关文章

  1. 「区间DP」「洛谷P1043」数字游戏

    「洛谷P1043」数字游戏 日后再写 代码 /*#!/bin/sh dir=$GEDIT_CURRENT_DOCUMENT_DIR name=$GEDIT_CURRENT_DOCUMENT_NAME ...

  2. Solution -「JSOI 2019」「洛谷 P5334」节日庆典

    \(\mathscr{Description}\)   Link.   给定字符串 \(S\),求 \(S\) 的每个前缀的最小表示法起始下标(若有多个,取最小的).   \(|S|\le3\time ...

  3. Solution -「洛谷 P4372」Out of Sorts P

    \(\mathcal{Description}\)   OurOJ & 洛谷 P4372(几乎一致)   设计一个排序算法,设现在对 \(\{a_n\}\) 中 \([l,r]\) 内的元素排 ...

  4. Solution -「POI 2010」「洛谷 P3511」MOS-Bridges

    \(\mathcal{Description}\)   Link.(洛谷上这翻译真的一言难尽呐.   给定一个 \(n\) 个点 \(m\) 条边的无向图,一条边 \((u,v,a,b)\) 表示从 ...

  5. Solution -「APIO 2016」「洛谷 P3643」划艇

    \(\mathcal{Description}\)   Link & 双倍经验.   给定 \(n\) 个区间 \([a_i,b_i)\)(注意原题是闭区间,这里只为方便后文描述),求 \(\ ...

  6. Solution -「POI 2014」「洛谷 P5904」HOT-Hotels 加强版

    \(\mathcal{Description}\)   Link.   给定一棵 \(n\) 个点的树,求无序三元组 \((u,v,w)\) 的个数,满足其中任意两点树上距离相等.   \(n\le1 ...

  7. Solution -「JLOI 2015」「洛谷 P3262」战争调度

    \(\mathcal{Description}\)   Link.   给定一棵 \(n\) 层的完全二叉树,你把每个结点染成黑色或白色,满足黑色叶子个数不超过 \(m\).对于一个叶子 \(u\), ...

  8. Solution -「CTS 2019」「洛谷 P5404」氪金手游

    \(\mathcal{Description}\)   Link.   有 \(n\) 张卡牌,第 \(i\) 张的权值 \(w_i\in\{1,2,3\}\),且取值为 \(k\) 的概率正比于 \ ...

  9. Solution -「CEOI 2017」「洛谷 P4654」Mousetrap

    \(\mathscr{Description}\)   Link.   在一个含 \(n\) 个结点的树形迷宫中,迷宫管理者菈米莉丝和一只老鼠博弈.老鼠初始时在结点 \(y\),有且仅有结点 \(x\ ...

随机推荐

  1. gitlab新增ssh

    https://blog.csdn.net/u011925641/article/details/79897517

  2. win10中查看开关机时间及查看admin的RID的方法

    原文链接: https://www.toutiao.com/i6772133439593251339/ 打开系统的注册表 键盘输入win+r组合键出现运行窗口命令 输入regedit 按回车键,进入注 ...

  3. Word2010制作自动目录

    原文链接:https://www.toutiao.com/i6488296610873737741/ 原文从网上复制: 查看"开始"选项卡,"样式"功能组,我们 ...

  4. SYCOJ2205超级百钱百鸡

    题目-超级百钱百鸡 (shiyancang.cn) 百钱百鸡的加强版 百钱百鸡的话,因为是有范围,所以挨个挨个尝试即可,确定两个,即可确定第三个. 超级百钱百鸡,通过题目的描述,最后可以得到一个二元的 ...

  5. iframe页面总是提示需要重新登录怎么办

    原文链接:iframe页面二次登录问题 生产问题 问题背景 由于历史原因,公司内部系统有一些页面是基于iframe嵌入的其他系统的页面,之前一直运行正常,最近不知什么原因接连出现访问所有iframe页 ...

  6. Linux系统下,Redis的安装与启动

    1.安装Redis之前,我们先介绍下Redis: (1)Redis是什么?都有哪些特点? 概念:Redis (REmote DIctionary Server) 是用 C 语言开发的一个开源的高性能键 ...

  7. vue3路由的使用,保证你有所收获!

    路由变量 有的小伙伴,可能是第一次听见路由变量这个词. 什么是路由变量了,顾名思义就是这个路由地址是动态的,不是固定的. 它的运用场景是哪里呢? 比如说:1.详情页的地址,我们就可以去使用路由变量. ...

  8. TeXstudio在右边显示预览

    打开预览界面后: 点击查看(View) 选择最后一个:窗口/内嵌(Windowed/Embedded) 就可以了

  9. 什么是Filter过滤器

    一,什么是Filter过滤器: JavaWeb三大组件之一 Filter过滤器是JavaEE的规范.也就是接口 Filter过滤器作用:拦截请求,过滤响应 拦截请求常见的应用场景有: 1,权限检查 2 ...

  10. 关于一键提取QQ群成员信息的记录

    问题情境 昨天晚上回宿舍看到舍友在吐槽:天哪,我要把70多个人的QQ号全统计出来,只能一个一个地在咱们学院的学院群里找.吐了. 当时我第一反应是用python写个脚本之类的去做,因此查阅了一下资料,找 ...