【BZOJ3745】[Coci2015]Norma

Description

Input

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

Output

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

Sample Input

4
2
4
1
4

Sample Output

109
【数据范围】
N <= 500000
1 <= a_i <= 10^8

题解:最近做这种题好像有点多啊~(虽然我基本上都没A)。

比较直接的想法就是找出区间的最大值mid,然后分治处理[l,mid-1]和[mid+1,r],但是这就要求我们在统计[l,r]的答案时,花费的时间不超过较短的那个区间的长度,于是比较难搞,所以我们还是考虑cdq分治。

我们从右往左枚举[l,mid]中的每个点i,设[i,mid]中的最小值为mn,最大值为mx。同时在[mid+1,r]中维护两个指针a,b,满足min[mid+1,a]>=mn,max[mid+1,b]<=mx。假设a<b,那么[mid+1,r]就被我们分成了三块,我们分别考虑j在每个块内的答案。

1.j<=a:

$ans+=mx\times mn\sum\limits_{j=mid+1}^a(j-i+1)$

等差数列算一下即可
2.a<j<=b:

$ans+=mx\times \sum\limits_{j=a+1}^bmin[a+1,j]\times(j-i+1)\\=mx\times(\sum\limits_{j=a+1}^bmin[a+1,j]*j-\sum\limits_{j=a+1}^bmid[a+1,j]*(i-1))$,

我们预处理出$\sum\limits_{j=a+1}^bmin[a+1,j]*j$和$\sum\limits_{j=a+1}^bmin[a+1,j]$即可。

3.b<j<=r:$ans+=\sum\limits_{j=b+1}^rmin[b+1,j]\times max[b+1,j] \times (j-i+1)=\sum\limits_{j=b+1}^rmin[b+1,j]\times max[b+1,j]\times j-\sum\limits_{j=b+1}^rmin[b+1,j]\times max[b+1,j]\times(i-1)$,

我们预处理出$\sum\limits_{j=b+1}^rmin[b+1,j]\times max[b+1,j]\times j$和$\sum\limits_{j=b+1}^rmin[b+1,j]\times max[b+1,j]$即可。

写完题解发现上面那一坨latex是什么玩意~太丑了将就看吧~

#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
typedef long long ll;
const int maxn=500010;
const ll mod=1000000000;
const ll inf=1ll<<30;
int n;
ll ans;
ll v[maxn],sn[maxn],cn[maxn],sm[maxn],cm[maxn],sw[maxn],cw[maxn];
int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc<'0'||gc>'9') {if(gc=='-')f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
return ret*f;
}
void solve(int l,int r)
{
if(l==r)
{
ans=(ans+v[l]*v[l])%mod;
return ;
}
int mid=l+r>>1,i,j,k;
ll a,b;
ll mx=0,mn=inf;
solve(l,mid),solve(mid+1,r);
for(sm[mid]=sn[mid]=sw[mid]=cm[mid]=cn[mid]=cw[mid]=0,i=mid+1;i<=r;i++)
{
mx=max(mx,v[i]),mn=min(mn,v[i]);
sm[i]=(sm[i-1]+mx)%mod,sn[i]=(sn[i-1]+mn)%mod,sw[i]=(sw[i-1]+mx*mn)%mod;
cm[i]=(cm[i-1]+mx*i)%mod,cn[i]=(cn[i-1]+mn*i)%mod;
cw[i]=(cw[i-1]+mx*mn%mod*i)%mod;
}
for(i=j=k=mid,mx=0,mn=inf;i>=l;i--)
{
mx=max(mx,v[i]),mn=min(mn,v[i]);
for(;j<r&&v[j]>=mn&&v[j+1]>=mn;j++);
for(;k<r&&v[k]<=mx&&v[k+1]<=mx;k++);
a=min(j,k),b=max(j,k);
ans=ans+mx*mn%mod*((mid+a-i-i+3)*(a-mid)/2%mod)%mod;
ans=((ans+cw[r]-cw[b]-(i-1)*(sw[r]-sw[b]))%mod+mod)%mod;
if(j<k) ans=(ans+mx*(cn[b]-cn[a]-(i-1)*(sn[b]-sn[a])%mod)%mod+mod)%mod;
else ans=(ans+mn*(cm[b]-cm[a]-(i-1)*(sm[b]-sm[a])%mod)%mod+mod)%mod;
}
}
int main()
{
n=rd();
int i;
for(i=1;i<=n;i++) v[i]=rd();
solve(1,n);
printf("%lld",ans);
return 0;
}
//3 1 2 1

【BZOJ3745】[Coci2015]Norma cdq分治的更多相关文章

  1. NORMA2 - Norma [cdq分治]

    题面 洛谷 你有一个长度为n的序列,定义这个序列中每个区间的价值是 \(Cost(i,j)=Min(Ai...Aj)∗Max(Ai...Aj)∗(j−i+1)Cost(i,j)=Min(A_{i}.. ...

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

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

  3. [BZOJ3745][COCI2015]Norma[分治]

    题意 题目链接 分析 考虑分治,记当前分治区间为 \(l,r\) . 枚举左端点,然后发现右端点无非三种情况: 极大极小值都在左边; 有一个在左边; 极大极小值都在右边; 考虑递推 \(l\) 的同时 ...

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

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

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

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

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

  7. bzoj3745: [Coci2015]Norma

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

  8. 【BZOJ3745】Norma(CDQ分治)

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

  9. 【CF526F】Pudding Monsters cdq分治

    [CF526F]Pudding Monsters 题意:给你一个排列$p_i$,问你有对少个区间的值域段是连续的. $n\le 3\times 10^5$ 题解:bzoj3745 Norma 的弱化版 ...

随机推荐

  1. Android Studio插件Gsonformat的安装和使用

    在开发中,我们获得服务端的json数据后要建立自己的bean,但是一条一条写相当麻烦,使用了GsonFormat插件,用起来非常方便. 安装 方法1: 1.Android studio File-&g ...

  2. rpm安装与卸载命令

    linux删除目录(文件夹):rmdir 目录名(目录需非空):直接删除可用: rm -rf 目录名 ,不需考虑是否为空 SecureCRT上传文件:rz  ,下载文件:sz rpm 安装:rpm - ...

  3. iOS申请证书,Certificates, Identifiers &Profiles 简介 - 申请证书

    在真机调试以及发布应用时,要申请证书,我们必须知道Certificates, Identifiers ,Profiles 是什么含义,下面对它们做简单介绍,以及如果申请证书. Certificates ...

  4. Scut游戏服务器引擎之新手入门

    1. 开发语言:Scut提供C#或Python两种脚本语言开发,Python脚本的性能会比较差,建议使用编译执行的C#代码: 2. 运行平台:Scut可以Window与Linux平台上运行,Linux ...

  5. Windows API 教程(七) hook 钩子监听

    茵蒂克丝 如何创建一个窗口 手动创建窗口的流程 实际代码 安装钩子 (Install hook) 钩子简介 SetWindowsHookEx 函数 设置监听[键盘]消息 设置监听[鼠标]消息 如何创建 ...

  6. 接口性能测试方案 白皮书 V1.0

    一. 性能测试术语解释 1. 响应时间 响应时间即从应用系统发出请求开始,到客户端接收到最后一个字节数据为止所消耗的时间.响应时间按软件的特点再可以细分,如对于一个 C/S 软件的响应时间可以细分为网 ...

  7. js 简单getByClass得封装

    function getByClass(oParent,sClass){ var elems = oParent.getElementsByTagName("*"); var ar ...

  8. Android Design Support Library(2)- TextInputLayout的使用

    原创文章,转载请注明 http://blog.csdn.net/leejizhou/article/details/50494634 这篇文章介绍下Android Design Support Lib ...

  9. 代理server的概要知识

    技术支持请留言:http://www.lcpower.cn 一.什么是代理server? 代理server英文全称是Proxy Server.其功能就是代理网络用户去取得网络信息.形象的说:它是网络信 ...

  10. 云数据库 RDS 版怎么创建数据库和账号MySQL 5.7版

    若要使用云数据库RDS,您需要在实例中创建数据库和账号.对于MySQL 5.7版本的实例,您需要通过RDS控制台创建一个初始账号,然后可以通过数据管理(DMS)控制台创建和管理数据库.本文将主要介绍在 ...