<更新提示>

<第一次更新>


<正文>

Norma

Description

Input Format

第1行,一个整数N;

第2~n+1行,每行一个整数表示序列a。

Output Format

输出答案对10^9取模后的结果。

Sample Input

4
2
4
1
4

Sample Output

109

解析

可以考虑分治计算贡献,对于一次分治\((l,r,mid)\),我们只需要计算跨过中点\(mid\)的子区间带来的贡献即可。

我们可以枚举一个左端点\(L\in[l,mid]\),然后尝试计算所有的\(R\in[mid+1,r]\),区间\([L,R]\)的贡献之和,然后就是推公式了。

对于确定的\(L\),我们先假设\(min=\min\{a_L,a_{L+1},...,a_{mid}\},max=\max\{a_L,a_{L+1},...,a_{mid}\}\),然后,我们令\(p\)为满足\(a_p<min,p\in[mid+1,r]\)最小的位置,\(q\)为满足\(a_q>max,q\in[mid+1,r]\)最小的位置,然后计算贡献。

不妨设\(p\leq q\),那么对于\(R\in[mid+1,p)\),区间\([L,R]\)的最大最小值为\(min,max\),贡献为:

\[min\times max\times\sum_{R=mid+1}^{p-1} (R-L+1)
\]

直接计算即可。

对于\(R\in[p,q)\),区间的最大值为\(max\),最小值为\(\min\{a_{mid+1},...,a_R\}\),贡献为

\[max\times \sum_{R=p}^{q-1}min_R\times (R-L+1)\\=max\times \sum_{R=p}^{q-1}min_R\times R-max\times (L-1)\sum_{R=p}^{q-1}min_R
\]

维护\(min_R\times R\)和\(min_R\)两个前缀和即可。

对于\(R\in[q,r]\),区间的最大值为\(\max\{a_{mid+1},...,a_R\}\),最小值为\(\min\{a_{mid+1},...,a_R\}\),贡献为

\[\sum_{R=q}^rmax_R\times min_R\times(R-L+1)\\=\sum_{R=q}^rmax_R\times min_R\times R-(L-1)\sum_{R=q}^rmax_R\times min_R
\]

维护\(max_R\times min_R\times R\)和\(max_R\times min_R\)两个前缀和即可。

对于\(q<p\),只有第二部分不一样,其贡献为

\[min\times \sum_{R=p}^{q-1}max_R\times R-min\times (L-1)\sum_{R=p}^{q-1}max_R
\]

维护\(max_R\times R\)和\(max_R\)两个前缀和即可。

于是这道题就解决了。

\(Code:\)

#include <bits/stdc++.h>
using namespace std;
const int N = 500020 , Mod = 1e9 , INF = 0x3f3f3f3f;
int n;
long long ans,a[N],Min[N],Max[N],sMin[N],sMax[N],MinMax[N],sMinMax[N];
inline long long add(long long a,long long b) { long long c = a + b; while ( c >= Mod ) c -= Mod; return c; }
inline void upd(long long &a,long long b) { a = add( a , b ); }
inline long long sigma(int l,int r) { return 1LL * ( l + r ) * ( r - l + 1 ) / 2 % Mod; }
inline void divide(int l,int r)
{
if ( l == r ) return upd( ans , a[l] * a[l] % Mod );
int mid = l + r >> 1; long long mn = INF, mx = 0;
divide( l , mid ) , divide( mid + 1 , r );
Min[mid] = Max[mid] = sMin[mid] = sMax[mid] = MinMax[mid] = sMinMax[mid] = 0;
for (int i=mid+1;i<=r;i++)
{
mn = min( mn , a[i] ) , mx = max( mx , a[i] );
Min[i] = add( Min[i-1] , mn ) , Max[i] = add( Max[i-1] , mx );
sMin[i] = add( sMin[i-1] , mn * i % Mod );
sMax[i] = add( sMax[i-1] , mx * i % Mod );
MinMax[i] = add( MinMax[i-1] , mn * mx % Mod );
sMinMax[i] = add( sMinMax[i-1] , mn * mx % Mod * i % Mod );
}
mn = INF , mx = 0;
int p = mid + 1 , q = mid + 1;
for (int i=mid;i>=l;i--)
{
mn = min( mn , a[i] ) , mx = max( mx , a[i] );
while ( p <= r && a[p] >= mn ) p++;
while ( q <= r && a[q] <= mx ) q++;
if ( p <= q )
{
upd( ans , mn * mx % Mod * sigma( mid - i + 2 , p - i ) % Mod );
upd( ans , mx * ( sMin[q-1] - sMin[p-1] ) % Mod - mx * (i-1) % Mod * ( Min[q-1] - Min[p-1] ) % Mod + Mod );
upd( ans , ( sMinMax[r] - sMinMax[q-1] ) - (i-1) * ( MinMax[r] - MinMax[q-1] ) % Mod + Mod );
}
if ( p > q )
{
upd( ans , mn * mx % Mod * sigma( mid - i + 2 , q - i ) % Mod );
upd( ans , mn * ( sMax[p-1] - sMax[q-1] ) % Mod - mn * (i-1) % Mod * ( Max[p-1] - Max[q-1] ) % Mod + Mod );
upd( ans , ( sMinMax[r] - sMinMax[p-1] ) - (i-1) * ( MinMax[r] - MinMax[p-1] ) % Mod + Mod );
}
}
}
int main(void)
{
freopen("norma.in","r",stdin);
freopen("norma.out","w",stdout);
scanf("%d",&n);
for (int i=1;i<=n;i++)
scanf("%lld",&a[i]) , a[i] %= Mod;
divide( 1 , n );
printf("%lld\n",ans);
return 0;
}

<后记>

『Norma 分治』的更多相关文章

  1. 似魔鬼的 『 document.write 』

    在平时的工作中,楼主很少用 document.write 方法,一直觉得 document.write 是个危险的方法.楼主不用,并不代表别人不用,最近给维护的项目添了一点代码,更加深了我对 &quo ...

  2. 拾遗:『Linux Capability』

    『Linux Capability』 For the purpose of performing permission checks, traditional UNIX implementations ...

  3. 『创意欣赏』20款精致的 iOS7 APP 图标设计

    这篇文章给大家分享20款精致的 iOS7 移动应用程序图标,遵循图形设计的现代潮流,所有图标都非常了不起,给人惊喜.通过学习这些移动应用程序图标,设计人员可以提高他们的创作,使移动用户界面看起来更有趣 ...

  4. 『设计前沿』14款精致的国外 iOS7 图标设计示例

    每天都有大量的应用程序发布到 iOS App Store 上,在数量巨大的应用中想要引起用户的主要,首要的就是独特的图标设计.这篇文章收集了14款精致的国外 iOS7 图标设计示例,希望能带给你设计灵 ...

  5. Github 恶搞教程(一起『玩坏』自己的 Github 吧)

    最近在伯乐在线读到一篇趣文,<如何在 Github『正确』做贡献>,里面各种能人恶搞 Github 的『Public contributions』,下面截取几个小伙伴的战绩: 顺藤摸瓜,发 ...

  6. 『创意欣赏』30幅逼真的 3D 虚拟现实环境呈现

    又到周末了,给大家分享30幅漂亮的 3D 虚拟现实环境呈现,放松一下.这些创造性的场景都是通过 3D 图形设计软件,结合三维现实环境渲染制作出来的.一起欣赏:) 您可能感兴趣的相关文章 20幅温馨浪漫 ...

  7. [TYVJ1827]『Citric II』一道防AK好题

    时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 第二届『Citric杯』NOIP提高组模拟赛第一题 描述 Lemon认为在第一届『Citric』杯模拟赛中出的 ...

  8. 办理滑铁卢大学(本科)学历认证『微信171922772』UW学位证成绩单使馆认证University of Waterloo

    办理滑铁卢大学(本科)学历认证『微信171922772』UW学位证成绩单使馆认证University of Waterloo QQ/微信171922772办理毕业证成绩单.真实使馆及教育部学历认证★诚 ...

  9. 办理渥太华大学(本科)学历认证『微信171922772』Ottawa U学位证成绩单使馆认证University of Ottawa

    办理渥太华大学(本科)学历认证『微信171922772』Ottawa U学位证成绩单使馆认证University of Ottawa QQ/微信171922772办理毕业证成绩单.真实使馆及教育部学历 ...

随机推荐

  1. ThreadPoolTaskExecutor学习

    1. ThreadPoolTaskExecutor学习 1.1. 前言 我们知道一般创建线程池,我们都用ThreadPoolExecutor,但实际上Spring它也对该线程池做了一层封装,他就是Th ...

  2. [TCP/IP] 三次握手过程中有哪些不安全性

    1)SYN flood 泛洪攻击 , 伪装的IP向服务器发送一个SYN请求建立连接,然后服务器向该IP回复SYN和ACK,但是找不到该IP对应的主机,当超时时服务器收不到ACK会重复发送.当大量的攻击 ...

  3. jenkins使用小技巧:jenkins构建出来的war/jar包如何带上SVN号?

    在实际使用过程中,一般会这样比如说打出来的包是 mypackage.jar, 但是每次打出来都是固定的 mypackage.jar如何来区分和上一个包的区别呢? 一般来说,会把打出来的包带上个 svn ...

  4. 自动化部署-Jenkins备份回滚

    1.备份 备份可以使用批处理命令解决,实际就是复制当前发布文件 ::备份文件夹名,使用当前时间 set foldername=%date:~0,4%%date:~5,2%%date:~8,2%%tim ...

  5. SpringMVC结果参数转换XSS攻击安全处理

    首先在sprigMvc的配置文件中配置返回结果集使用的类 <!-- 参数转码 --> <mvc:annotation-driven> <!-- 注册处理 JSON 的转换 ...

  6. 201871010101-陈来弟《面向对象程序设计(JAVA)》 第14周学习总结

    实验十二  Swing图形界面组件(一) 实验时间 2019-11-29 第一部分:基础知识 Swing和MVC设计模式 (1)设计模式(Design pattern)是设计者一种流行的 思考设计问题 ...

  7. sed与grep练习题

    第1章 练习题 第1题 取得/etc/hosts 文件的权限 如何取得/etc/hosts 文件的权限对应的数字内容,如-rw-r--r--  为 644,要求使用命令取得644 这样的数字. 方法一 ...

  8. python结巴分词余弦相似度算法实现

    过余弦相似度算法计算两个字符串之间的相关度,来对关键词进行归类.重写标题.文章伪原创等功能, 让你目瞪口呆.以下案例使用的母词文件均为txt文件,两种格式:一种内容是纯关键词的txt,每行一个关键词就 ...

  9. 如何用node编写命令行工具,附上一个ginit示例,并推荐好用的命令行工具

    原文 手把手教你写一个 Node.js CLI 强大的 Node.js 除了能写传统的 Web 应用,其实还有更广泛的用途.微服务.REST API.各种工具……甚至还能开发物联网和桌面应用.Java ...

  10. django之choice、ajax初步

    django之choice参数,ajax choice参数 应用场景:主要是用户性别.用户工作状态.成绩对应 ##在测试文件中运行,需要写以下几个模块 if __name__ == "__m ...