题意

题目链接

分析

  • 考虑分治,记当前分治区间为 \(l,r\) 。

  • 枚举左端点,然后发现右端点无非三种情况:

    • 极大极小值都在左边;
    • 有一个在左边;
    • 极大极小值都在右边;
  • 考虑递推 \(l\) 的同时递推最靠右的满足最大最小值在左边的位置 \(p_1,p_2\).

  • 根据不同的情况计数即可,注意计算以 \(\rm mid\) 作为右端点的情况。

  • 总时间复杂度为\((nlogn)\)。

重点:分治算法降低复杂度的原因:根据极大极小值的不同划分数据以及?

代码

#include<bits/stdc++.h>
using namespace std;
#define go(u) for(int i=head[u],v=e[i].to;i;i=e[i].last,v=e[i].to)
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define pb push_back
#define For for(int j=1;j<=6;++j)
typedef long long LL;
inline int gi(){
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
while(isdigit(ch)){x=(x<<3)+(x<<1)+ch-48;ch=getchar();}
return x*f;
}
template<typename T>inline bool Max(T &a,T b){return a<b?a=b,1:0;}
template<typename T>inline bool Min(T &a,T b){return b<a?a=b,1:0;}
const int N=5e5 + 7;
const LL mod=1e9;
int n;
LL a[N],s[7][N],ans;
void add(LL &a,LL b){a+=b;if(a>=mod) a-=mod;}
LL s1(int x){
return 1ll*x*(x+1)/2%mod;
}
void fz(int l,int r){
if(l==r){ add(ans,a[l]*a[l]%mod);return ;}
if(l>r) return;
int mid=l+r>>1;LL mx=a[mid],mi=a[mid];
For s[j][mid-1]=0;
for(int i=mid;i<=r;++i){
Min(mi,a[i]);Max(mx,a[i]);
For s[j][i]=s[j][i-1];
add(s[1][i],mi*mx%mod);
add(s[2][i],(i-mid)*mi%mod*mx%mod);
add(s[3][i],mi);
add(s[4][i],mx);
add(s[5][i],(i-mid)*mi%mod);
add(s[6][i],(i-mid)*mx%mod);
}
mx=mi=a[mid];
int p1=mid,p2=mid;
for(int i=mid;i>=l;--i){
Min(mi,a[i]);Max(mx,a[i]);
for(;p1+1<=r&&a[p1+1]>=mi;++p1);
for(;p2+1<=r&&a[p2+1]<=mx;++p2);
int k1=min(p1,p2),k2=max(p1,p2);
add(ans,(s1(k1-i+1)-s1(mid-i)+mod)*mi%mod*mx%mod);
if(k1==p1){
add(ans,(s[5][k2]-s[5][k1]+mod)*mx%mod);
add(ans,(s[3][k2]-s[3][k1]+mod)*(mid-i+1)%mod*mx%mod);
}else{
add(ans,(s[6][k2]-s[6][k1]+mod)*mi%mod);
add(ans,(s[4][k2]-s[4][k1]+mod)*(mid-i+1)%mod*mi%mod);
}
add(ans,(s[2][r]-s[2][k2]+mod)%mod);
add(ans,(s[1][r]-s[1][k2]+mod)*(mid-i+1)%mod);
}
fz(l,mid-1);fz(mid+1,r);
}
int main(){
n=gi();
rep(i,1,n) a[i]=gi();
fz(1,n);
printf("%lld\n",ans);
return 0;
}

[BZOJ3745][COCI2015]Norma[分治]的更多相关文章

  1. bzoj3745: [Coci2015]Norma 分治,单调队列

    链接 bzoj 思路 首先\(\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n}\sum\limits_{k=i}^{j}max(a_k)\)可以用单调队列求解.参见 ...

  2. 【BZOJ3745】Norma [分治]

    Norma Time Limit: 20 Sec  Memory Limit: 64 MB[Submit][Status][Discuss] Description Input 第1行,一个整数N: ...

  3. bzoj3745: [Coci2015]Norma

    Description Input 第1行,一个整数N: 第2~n+1行,每行一个整数表示序列a. Output 输出答案对10^9取模后的结果. 预处理每个位置的数作为最小/大值向左延伸的最大距离, ...

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

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

  5. 【BZOJ3745】Norma(CDQ分治)

    [BZOJ3745]Norma(CDQ分治) 题面 BZOJ 洛谷 题解 这种问题直接做不好做,显然需要一定的优化.考虑\(CDQ\)分治. 现在唯一需要考虑的就是跨越当前中间节点的所有区间如何计算答 ...

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

  7. BZOJ3745:[COCI2015]Norma

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

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

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

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

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

随机推荐

  1. Bootstrap后台管理框架

    B-JUI http://www.xknaan.com/ B-JUI 前端框架,基于Bootstrap的Jquery UI框架,核心思想脱胎于DWZ(j-ui).   BJUI_SSM_DEMO 基于 ...

  2. C# 算法题系列(一) 两数之和、无重复字符的最长子串

    题目一 原题链接 https://leetcode-cn.com/problems/two-sum/ 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整 ...

  3. jQuery: 刨根问底 attr and prop两个函数的区别

    In this short post I will explain the difference between attributes and properties in HTML. The .pro ...

  4. October 2nd 2017 Week 40th Monday

    Grown-ups work for things. Grown-ups pay. Grown-ups suffer consequences. 真正的成年人会奋斗.会付出.会承担后果. How to ...

  5. 前端技术-HTML页面的加载

    HTML页面的加载 HTML页面的加载实际上是基于http过程+浏览器对数据的解析渲染. http协议的请求过程是基于TCP协议的.http是要基于TCP连接基础上,简单的说,TCP单纯建立连接,不涉 ...

  6. 在windows下的虚拟环境中使用tk,要留神了

    事情是这样的:有朋友在学习用matplotlib作图,遇到一些问题问我,我也没用过,就想先装一个试试.然后呢,我就随手创建了个虚拟环境.结果,涉及到matplotlib的第一行就报错了: Traceb ...

  7. Python之美[从菜鸟到高手]--2+2=5

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/yueguanghaidao/article/details/35644165     今天在伯乐在线 ...

  8. juquery去除字符串前后的空格

    1.  去掉字符串前后所有空格: 代码如下: function Trim(str) { return str.replace(/(^\s*)|(\s*$)/g, ""); }

  9. JS创建类的方法--简单易懂有实例

    版权声明:本文为博主原创文章,转载请注明出处 Javascript是一种基于对象的语言,你遇到的所有东西几乎都是对象.但是,它又不是一种真正的面向对象编程(OOP)语言,因为它的语法中没有Class. ...

  10. Solr服务在Linux上的搭建详细教程

    一.系统环境 注:欢迎大家转载,非商业用途请在醒目位置注明本文链接和作者名dijia478即可,商业用途请联系本人dijia478@163.com. CentOS-6.7-i386-bin-DVD1 ...