Description

Solution

考虑分治:

我们要统计跨越 \(mid\) 的区间的贡献

分最大值和最小值所在位置进行讨论:

设左边枚举到了 \(i\),左边 \([i,mid]\) 的最大值为 \(mx\),最小值为 \(mn\)

1.最大值最小值都在左边:\(\sum_{j=mid+1}^{p}mx*mn*(j-i+1)\),可以用等差数列直接算出

2.最大/小值有一个在左边 \(\sum_{j=p}^{q}mx*Mx[j]*(j-i+1)\) 我们可以拆成 \(\sum_{j=p}^{q}mx*Mx[j]*j-\sum_{j=1}^{q}mx*Mx[j]*(i-1)\)

3.最大值最小值都在右边:同理,拆除 \(j\) 和 \(i-1\) 这两项

分别维护前缀和即可

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=500005,mod=1e9;
int n,a[N],ans=0,sm[N],sn[N],smi[N],sni[N],s[N],Mn[N],Mx[N],sum[N];
inline void solve(int l,int r){
if(l==r){ans=(ans+1ll*a[l]*a[l])%mod;return ;}
int mid=(l+r)>>1;
solve(l,mid);solve(mid+1,r);
int mx=0,mn=mod,j=mid,k=mid;
s[mid]=sm[mid]=sn[mid]=smi[mid]=sni[mid]=Mx[mid]=0;Mn[mid]=mod;
for(int i=mid+1;i<=r;i++){
mx=max(mx,a[i]);mn=min(mn,a[i]);Mx[i]=mx;Mn[i]=mn;
sm[i]=(sm[i-1]+mx)%mod;sn[i]=(sn[i-1]+mn)%mod;
smi[i]=(smi[i-1]+1ll*mx*i)%mod;sni[i]=(sni[i-1]+1ll*mn*i)%mod;
s[i]=(s[i-1]+1ll*mx*mn%mod*i)%mod;sum[i]=(sum[i-1]+1ll*mx*mn)%mod;
}
mx=0;mn=mod;
for(int i=mid;i>=l;i--){
mx=max(mx,a[i]);mn=min(mn,a[i]);
while(j<r && Mn[j+1]>=mn)j++;
while(k<r && Mx[k+1]<=mx)k++;
int p=min(j,k),q=max(j,k);
ans=(ans+1ll*mx*mn%mod*((1ll*(mid-2*i+p+3)*(p-mid)>>1)%mod))%mod;
ans=(1ll*ans+s[r]-s[q]-1ll*(sum[r]-sum[q])*(i-1))%mod;
if(j<k)ans=(ans+1ll*mx*(1ll*sni[k]-sni[j]-1ll*(i-1)*(sn[k]-sn[j])%mod))%mod;
else ans=(ans+1ll*mn*(1ll*smi[j]-smi[k]-1ll*(i-1)*(sm[j]-sm[k])%mod))%mod;
}
}
int main(){
freopen("pp.in","r",stdin);
freopen("pp.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
solve(1,n);
if(ans<0)ans+=mod;
cout<<ans<<endl;
return 0;
}

bzoj 3745: [Coci2015]Norma的更多相关文章

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

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

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

  3. 【刷题】BZOJ 3745 [Coci2015]Norma

    Description Input 第1行,一个整数N: 第2~n+1行,每行一个整数表示序列a. Output 输出答案对10^9取模后的结果. Sample Input 4 2 4 1 4 Sam ...

  4. bzoj 3745: [Coci2015]Norma【分治】

    参考:https://blog.csdn.net/lych_cys/article/details/51203960 真的不擅长这种-- 分治,对于一个(l,r),先递归求出(l,mid),(mid+ ...

  5. 【BZOJ3745】[Coci2015]Norma cdq分治

    [BZOJ3745][Coci2015]Norma Description Input 第1行,一个整数N: 第2~n+1行,每行一个整数表示序列a. Output 输出答案对10^9取模后的结果. ...

  6. [BZOJ 3745] [COCI 2015] Norma

    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},\c ...

  7. BZOJ 3881: [Coci2015]Divljak [AC自动机 树链的并]

    3881: [Coci2015]Divljak 题意:添加新文本串,询问某个模式串在多少种文本串里出现过 模式串建AC自动机,考虑添加一个文本串,走到的节点记录下来求树链的并 方法是按dfs序排序去重 ...

  8. BZOJ 3881: [Coci2015]Divljak

    3881: [Coci2015]Divljak Time Limit: 20 Sec  Memory Limit: 768 MBSubmit: 553  Solved: 176[Submit][Sta ...

  9. BZOJ3745:[COCI2015]Norma

    浅谈离线分治算法:https://www.cnblogs.com/AKMer/p/10415556.html 题目传送门:https://lydsy.com/JudgeOnline/problem.p ...

随机推荐

  1. 关于C语言的第0次作业

    1.你认为大学的学习生活.同学关系.师生关系应该是怎样的?请一个个展开描述. 我认为的大学学习生活是充实的,丰富多彩的,与高中快节奏.繁忙的生活有所不同.在上了大学我们都成熟了很多,懂得了包容与忍让, ...

  2. C程序第二次作业

    2-1删除字符串中数字字符 1.设计思路 (1)主要描述题目算法 第一步:遍历指针s所指的s数组. 第二步:如果 * (s+i)在0至9之间的话,则跳过此 * (s+i). 第三步:如果* (s+i) ...

  3. QTableView

    QTableView常用于实现数据的表格显示.下面我们如何按步骤实现学生信息表格: 一 添加表头 //准备数据模型     QStandardItemModel *student_model = ne ...

  4. dede观看总结自己总结

    知识点一:{dede:arclist channelid="18" addfields="language,pfz" limit="0,5" ...

  5. Connect Appium Server Fail.A new session could not be created

    1.由于安卓测试机性能低下,并不能支持测试工作,想安装一个模拟器帮助测试,然后发现群里有朋友发了一个夜神模拟器..下载..安装..美滋滋的准备运行脚本.What..居然报错了..orz..然后百度查找 ...

  6. Mego(2) - NET主流ORM框架分析

    接上文我们测试了各个ORM框架的性能,大家可以很直观的看到各个ORM框架与原生的ADO.NET在境删改查的性能差异.这里和大家分享下我对ORM框架的理解及一些使用经验. ORM框架工作原理 典型ORM ...

  7. AngularJS1.X学习笔记11-服务

    如果我没记错的话,spring里边有个service层.什么是服务呢?个人理解就是很多地方要用的,可以跨越控制器甚至是跨越模块的工具.AngularJS也为我们提供了服务这种机制,这让我们可以将一些不 ...

  8. crontab的mysqldump备份任务未能完全正确执行的故障处理

    crontab是每个运维一线人员必须掌握的技术,熟练运用crontab可以自动帮助我们执行重复性的工作,提高运维的工作效率.它就像一个闹钟,在特定的时间,准时响应并执行相应的任务.如果你的工作经常与L ...

  9. Python内置函数(12)——str

    英文文档: class str(object='') class str(object=b'', encoding='utf-8', errors='strict') Return a string  ...

  10. JMeter入门(01)概念和样例

    一.概念 JMeter 是一款专门用于功能测试和压力测试的轻量级测试开发平台,实现了许多和互联网相关的网络测试组件,同时还保留着很强的扩展性. JMeter可以用来测试诸如:静态文件,Java Ser ...