bzoj 3745: [Coci2015]Norma
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的更多相关文章
- 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 ...
- bzoj 3745 [Coci2015]Norma——序列分治
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3745 如果分治,就能在本层仅算过 mid 的区间了. 可以从中间到左边地遍历左边,给右边两个 ...
- 【刷题】BZOJ 3745 [Coci2015]Norma
Description Input 第1行,一个整数N: 第2~n+1行,每行一个整数表示序列a. Output 输出答案对10^9取模后的结果. Sample Input 4 2 4 1 4 Sam ...
- bzoj 3745: [Coci2015]Norma【分治】
参考:https://blog.csdn.net/lych_cys/article/details/51203960 真的不擅长这种-- 分治,对于一个(l,r),先递归求出(l,mid),(mid+ ...
- 【BZOJ3745】[Coci2015]Norma cdq分治
[BZOJ3745][Coci2015]Norma Description Input 第1行,一个整数N: 第2~n+1行,每行一个整数表示序列a. Output 输出答案对10^9取模后的结果. ...
- [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 ...
- BZOJ 3881: [Coci2015]Divljak [AC自动机 树链的并]
3881: [Coci2015]Divljak 题意:添加新文本串,询问某个模式串在多少种文本串里出现过 模式串建AC自动机,考虑添加一个文本串,走到的节点记录下来求树链的并 方法是按dfs序排序去重 ...
- BZOJ 3881: [Coci2015]Divljak
3881: [Coci2015]Divljak Time Limit: 20 Sec Memory Limit: 768 MBSubmit: 553 Solved: 176[Submit][Sta ...
- BZOJ3745:[COCI2015]Norma
浅谈离线分治算法:https://www.cnblogs.com/AKMer/p/10415556.html 题目传送门:https://lydsy.com/JudgeOnline/problem.p ...
随机推荐
- PTA常见错误
1.最常犯的错误. 格式错误 在PTA程序检测中,输入输出要严格按照题目要求.输出的格式要完全按照题目要求来,该空格地方空格,该换行要换行.否则,就算你运行结果是对的,PTA还是提示你格式错误 比如下 ...
- 微信APP简要分析
Part1 走进微信APP 很明显,微信是很成功的APP. 微信 (WeChat) 是腾讯公司于2011年1月21日推出的一个为智能终端提供即时通讯服务的免费应用程序,现已是超过九亿人使用的手机应用. ...
- alpha-咸鱼冲刺day5-紫仪
总汇链接 一,合照 emmmmm.自然还是没有的. 二,项目燃尽图 三,项目进展 !!!QAQ可以做到跟数据库交互了!!!!先来撒花花!(然后继续甲板) 四,问题困难 日常啥都不会,百度真心玩一年 ...
- Bate敏捷冲刺每日报告--day2
1 团队介绍 团队组成: PM:齐爽爽(258) 小组成员:马帅(248),何健(267),蔡凯峰(285) Git链接:https://github.com/WHUSE2017/C-team 2 ...
- C语言:第0次作业
问题1: 你为什么选择计算机专业?你认为你的条件如何?和这些博主比呢? 感性地讲,高中时意外看到了电影<社交网络>,自那时起就将将马克扎克伯格视为偶像,他天才的智慧和长远的眼光深深吸引了我 ...
- 微信支付 chooseWXPay:fail
本来以为解决了微信支付get_brand_wcpay_request:faill这个问题后就万事大吉了,结果又迈入了另一个坑... 问题原因: 1.生成签名的时间戳参数名timestamp的s大小写问 ...
- 使用Google 的 gson方式解析json
gson支持解析的类型还是比较全面的,包括JavaBean,List<JavaBean>,List<String>,Map等,使用起来也是比较方便,下面根据代码示例给出总结: ...
- 浏览器端类EXCEL表格插件 版本更新 - 智表ZCELL产品V1.1.0.1版本发布
智表(ZCELL),浏览器下纯JS表格控件,为您提供EXCEL般的智能体验! 纯国产化.高性价比的可靠解决方案. 更新说明 让大家久等了.因为最近忙其他项目,发布时间稍有延迟. 下次版本更新 ...
- mingw打dll ,lib包命令和调用
1,下面的命令行将这个代码编译成 dll. gcc mydll.c -shared -o mydll.dll -Wl,--out-implib,mydll.lib 其中 -shared 告诉gcc d ...
- 为什么java中用枚举实现单例模式会更好
代码简洁 这是迄今为止最大的优点,如果你曾经在Java5之前写过单例模式代码,那么你会知道即使是使用双检锁你有时候也会返回不止一个实例对象.虽然这种问题通过改善java内存模型和使用volatile变 ...