BZOJ3745 COCI2015Norma(分治)
完全想不到地,考虑分治。
对区间[l,r],将左端点x由mid不断左移,右边记录最右的p满足max[mid+1,p]<=max[x,mid],q满足min[mid+1,q]>=min[x,mid]。这样右边被分成三部分,分别统计。
对于p和q左边的位置,这部分的max和min显然是由左边部分决定的,答案非常好算。
对于p和q右边的位置,这部分的max和min显然是由右边部分决定的,可以在分治的一开始预处理一个右区间的前缀len*max*min和max*min,这样就很好算了。
对于p和q中间的位置,若p在q左边,则这一部分最小值是由左边决定的,而最大值是由右边决定的,预处理右区间前缀len*max和max;反之同理。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int read()
{
int x=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
}
#define N 500010
#define P 1000000000
int n,a[N],lenmaxmin[N],maxmin[N],lenmax[N],lenmin[N],MAX[N],MIN[N],ans;
void inc(int &x,int y){x+=y;if (x>=P) x-=P;}
void solve(int l,int r)
{
if (l==r) {inc(ans,1ll*a[l]*a[l]%P);return;}
int mid=l+r>>;
solve(l,mid),solve(mid+,r);
int mx=,mn=P,p=mid,q=mid;
lenmaxmin[mid]=maxmin[mid]=lenmax[mid]=lenmin[mid]=MAX[mid]=MIN[mid]=;
for (int i=mid+;i<=r;i++)
{
mx=max(mx,a[i]),mn=min(mn,a[i]);
lenmaxmin[i]=(lenmaxmin[i-]+1ll*(i-mid)*mx%P*mn%P)%P;
maxmin[i]=(maxmin[i-]+1ll*mx*mn%P)%P;
lenmax[i]=(lenmax[i-]+1ll*(i-mid)*mx%P)%P;
lenmin[i]=(lenmin[i-]+1ll*(i-mid)*mn%P)%P;
MAX[i]=(MAX[i-]+mx)%P;
MIN[i]=(MIN[i-]+mn)%P;
}
mx=,mn=P;
for (int i=mid;i>=l;i--)
{
mx=max(mx,a[i]),mn=min(mn,a[i]);
while (p<r&&a[p+]<=mx) p++;
while (q<r&&a[q+]>=mn) q++;
inc(ans,((1ll*((mid-i++min(p,q)-i+)%P)*(min(p,q)-mid)>>)+P)%P*mx%P*mn%P);
inc(ans,(1ll*(maxmin[r]-maxmin[max(p,q)]+P)*(mid-i+)+lenmaxmin[r]-lenmaxmin[max(p,q)]+P)%P);
if (p<q) inc(ans,(1ll*(MAX[q]-MAX[p]+P)*(mid-i+)+lenmax[q]-lenmax[p]+P)%P*mn%P);
else inc(ans,(1ll*(MIN[p]-MIN[q]+P)*(mid-i+)+lenmin[p]-lenmin[q]+P)%P*mx%P);
}
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("bzoj3745.in","r",stdin);
freopen("bzoj3745.out","w",stdout);
#endif
n=read();
for (int i=;i<=n;i++) a[i]=read();
solve(,n);
cout<<ans;
return ;
}
BZOJ3745 COCI2015Norma(分治)的更多相关文章
- 【BZOJ3745】Norma(CDQ分治)
[BZOJ3745]Norma(CDQ分治) 题面 BZOJ 洛谷 题解 这种问题直接做不好做,显然需要一定的优化.考虑\(CDQ\)分治. 现在唯一需要考虑的就是跨越当前中间节点的所有区间如何计算答 ...
- 【BZOJ3745】Norma [分治]
Norma Time Limit: 20 Sec Memory Limit: 64 MB[Submit][Status][Discuss] Description Input 第1行,一个整数N: ...
- 【BZOJ3745】[Coci2015]Norma cdq分治
[BZOJ3745][Coci2015]Norma Description Input 第1行,一个整数N: 第2~n+1行,每行一个整数表示序列a. Output 输出答案对10^9取模后的结果. ...
- [BZOJ3745][COCI2015]Norma[分治]
题意 题目链接 分析 考虑分治,记当前分治区间为 \(l,r\) . 枚举左端点,然后发现右端点无非三种情况: 极大极小值都在左边; 有一个在左边; 极大极小值都在右边; 考虑递推 \(l\) 的同时 ...
- bzoj3745: [Coci2015]Norma 分治,单调队列
链接 bzoj 思路 首先\(\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n}\sum\limits_{k=i}^{j}max(a_k)\)可以用单调队列求解.参见 ...
- BZOJ3745 / SP22343 NORMA2 - Norma 分治,CDQ分治
要命的题目. 写法:分类讨论进行计算. 枚举过每一个\(mid\)的所有区间.对于左端点\(i∈[l, mid - 1]\),向左推并计算\([l,mid]\)范围内的最大\(/\)最小值. 然后右端 ...
- 题解-COCI-2015Norma
Problem SPOJ-NORMA2 & bzoj3745 题意概要:给定一个正整数序列 \(\{a_i\}\),求 \[\sum_{i=1}^n\sum_{j=i}^n(j-i+1)\mi ...
- 【CF526F】Pudding Monsters cdq分治
[CF526F]Pudding Monsters 题意:给你一个排列$p_i$,问你有对少个区间的值域段是连续的. $n\le 3\times 10^5$ 题解:bzoj3745 Norma 的弱化版 ...
- [bzoj2152][聪聪和可可] (点分治+概率)
Description 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)……遇到这种问题,一般情况下石头剪刀布就好 ...
随机推荐
- RHCSA day5
4.调整逻辑卷容量 请按照以下要求调整本地逻辑卷lvm1的容量: 调整后的逻辑卷及文件系统大小为770MiB 调整后确保文件系统中已存在的内容不能被破坏 调整后的容量可能出现误差,只要在730MiB ...
- (二)SpringBoot2.0基础篇- 静态资源的访问及Thymeleaf模板引擎的使用
一.描述 在应用系统开发的过程中,不可避免的需要使用静态资源(浏览器看的懂,他可以有变量,例:HTML页面,css样式文件,文本,属性文件,图片等): 并且SpringBoot内置了Thymeleaf ...
- L018-课前练习以及知识巩固笔记
L018-课前练习以及知识巩固笔记 OK,今天课前做了几道题,算是对以往知识的巩固. 1.请描述下列路径的内容是做什么的?/etc/sysctl.conf/etc/rc.local/etc/hosts ...
- 04-JVM内存模型:直接内存
1.1.什么是直接内存(Derect Memory) 在内存模型最开始的章节中,我们画出了JVM的内存模型,里面并不包含直接内存,也就是说这块内存区域并不是JVM运行时数据区的一部分,但它却会被频繁的 ...
- 用python SMTP进行邮件发送
import smtplib from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart & ...
- VS2013只显示会附加到进程,无法启动调试
今天在使用VS2013的时候,打开突然发现,只显示附加到进程,无法进行调试,调试位置显示灰色,到网上各处寻求答案,本以为是个大问题,没想到只是个小问题.主要原因只是后台开太多东西了,导致VS2013运 ...
- manjaro i3下 dmenu terminal 和 terminal_hold 打开方式记录
分别用type为terminal 和 terminal_hold 打开eclipse 用terminal_hold打开,终端和界面分左右显示 用terminal打开,终端和界面分上下显示 除了排列方式 ...
- NO.05--谈一谈Angular 和 Vue.js 的对比。
几天的vue之后,给需要的盆友们带来一篇对比,也算是我近期之内业余时间的大工程,现在开始: Vue.js 是开源的 JavaScript 框架,能够帮助开发者构建出美观的 Web 界面.当和其它网络工 ...
- java面向对象的冒泡排序,选择排序和插入排序的比较
这三种排序有俩个过程: 1.比较俩个数据. 2.交换俩个数据或复制其中一项. 这三种排序的时间级别 冒泡排序:比较 (N-1)+(N-2)+...+2+1 = N*(N-1)/2=N2/2 交换 0 ...
- 项目进行ing
1.我们的看板 2.立行会议 (1)照片 (2)时间:每天20:00 (3)地点:学校研发中心会议室 3.看板进展: 已有6个任务被移到Check Out栏中,详细情况如下: 梁植淋:构建项目架构,封 ...