NORMA2 - Norma [cdq分治]
题面
你有一个长度为n的序列,定义这个序列中每个区间的价值是
\(Cost(i,j)=Min(Ai...Aj)∗Max(Ai...Aj)∗(j−i+1)Cost(i,j)=Min(A_{i}...A_{j})*Max(A_{i}...A_{j})*(j-i+1)\)
其中,\(i,j\)是区间的两个端点。
现在请你求出给定序列所有区间的价值之和。
\(n \leq 5e5\)
统计所有子区间 考虑cdq分治
左区间对右区间的贡献如何计算?
用一个cur从mid到L扫左区间
mn,mx表示[cur, mid]的最小值和最大值
对于每一个cur 维护在右区间的两个位置p, q
p表示[mid + 1, p - 1]的数都大于等于mn 而a[p] < mn
q表示[mid + 1, q - 1]的数都小于等于mx 而a[q] > mx
很明显p,q都满足单调性 那么复杂度就可以控制在线性了
当p<q时
对于右区间被分成的三个区间[mid + 1, p - 1], [p, q - 1], [q, R]
mn,mx对这几个区间的贡献推一下式子就好啦
式子参考
对了 注意L==R时计算单点贡献
#include <algorithm>
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <cstring>
using namespace std;
const int N = 5e5 + 5;
const int inf = 0x3f3f3f3f;
const long long P = 1e9;
int n;
long long a[N], ans, s1[N], s2[N], s3[N], s4[N], s5[N], s6[N];
/*
s1 max * min * i
s2 max * min
s3 min * i
s4 min
s5 max * i
s6 max
*/
inline long long Sum(long long L, long long R){
return (L + R) * (R - L + 1) / 2ll % P;
}
inline void add(long long x){
ans = (ans + x %P) % P;
}
void cdq(int L, int R){
if(L == R) {add(a[L] * a[L] % P); return ;}
int mid = L + ((R - L) >> 1);
cdq(L, mid); cdq(mid + 1, R);
long long mx = 0, mn = inf;
s1[mid] = s2[mid] = s3[mid] = s4[mid] = s5[mid] = s6[mid] = 0;
//printf("----------------\n");
for(int i = mid + 1; i <= R; ++i){
mx = max(a[i], mx), mn = min(a[i], mn);
s1[i] = (mn * mx %P * i %P + s1[i -1]) %P;
s2[i] = (mn * mx %P + s2[i -1])%P;
s3[i] = (mn * i %P + s3[i -1])%P;
s4[i] = (mn + s4[i -1]) %P;
s5[i] = (mx * i %P + s5[i -1])%P;
s6[i] = (mx + s6[i -1]) %P;
//printf("%lld %lld %lld %lld %lld %lld %lld %lld\n", mn, mx, s1[i], s2[i], s3[i], s4[i], s5[i], s6[i]);
}
mn = inf, mx = 0;
for(int p = mid + 1, q = mid + 1, i = mid; i >= L; --i){
mx = max(a[i], mx), mn = min(a[i], mn);
while(p <= R && a[p] >= mn) ++p;
while(q <= R && a[q] <= mx) ++q;//边界
if(p < q){
add(mx * mn %P * Sum(mid - i + 2, p - i) %P);
add(mx * (s3[q - 1] - s3[p - 1]) %P + P - mx * (i - 1) %P * (s4[q - 1] - s4[p - 1]) %P);
add((s1[R] - s1[q - 1]) + P - 1ll * (i - 1) * (s2[R] - s2[q - 1]) % P);
}
else{
add(mx * mn %P * Sum(mid - i + 2, q - i) %P);
add(mn * (s5[p - 1] - s5[q - 1]) %P + P - mn * (i - 1) %P * (s6[p - 1] - s6[q - 1]) %P);
add((s1[R] - s1[p - 1]) + P - 1ll * (i - 1) * (s2[R] - s2[p - 1]) % P);
}
}
//printf("%lld %d %d\n", ans, L, R);
}
int main(){
scanf("%d", &n);
a[0] = 0, a[n + 1] = inf;
for(int i = 1; i <= n; ++i){
scanf("%lld", &a[i]);
}
cdq(1, n);
printf("%lld", (ans %P + P) % P);
return 0;
}
NORMA2 - Norma [cdq分治]的更多相关文章
- 【BZOJ3745】[Coci2015]Norma cdq分治
[BZOJ3745][Coci2015]Norma Description Input 第1行,一个整数N: 第2~n+1行,每行一个整数表示序列a. Output 输出答案对10^9取模后的结果. ...
- 洛谷SP22343 NORMA2 - Norma(分治,前缀和)
洛谷题目传送门 这题推式子恶心..... 考虑分治,每次统计跨过\(mid\)的所有区间的答案和.\(i\)从\(mid-1\)到\(l\)枚举,统计以\(i\)为左端点的所有区间. 我们先维护好\( ...
- 【BZOJ3745】Norma(CDQ分治)
[BZOJ3745]Norma(CDQ分治) 题面 BZOJ 洛谷 题解 这种问题直接做不好做,显然需要一定的优化.考虑\(CDQ\)分治. 现在唯一需要考虑的就是跨越当前中间节点的所有区间如何计算答 ...
- 【CF526F】Pudding Monsters cdq分治
[CF526F]Pudding Monsters 题意:给你一个排列$p_i$,问你有对少个区间的值域段是连续的. $n\le 3\times 10^5$ 题解:bzoj3745 Norma 的弱化版 ...
- 【教程】简易CDQ分治教程&学习笔记
前言 辣鸡蒟蒻__stdcall终于会CDQ分治啦! CDQ分治是我们处理各类问题的重要武器.它的优势在于可以顶替复杂的高级数据结构,而且常数比较小:缺点在于必须离线操作. CDQ分治的基 ...
- BZOJ 2683 简单题 ——CDQ分治
[题目分析] 感觉CDQ分治和整体二分有着很本质的区别. 为什么还有许多人把他们放在一起,也许是因为代码很像吧. CDQ分治最重要的是加入了时间对答案的影响,x,y,t三个条件. 排序解决了x ,分治 ...
- HDU5618 & CDQ分治
Description: 三维数点 Solution: 第一道cdq分治...感觉还是很显然的虽然题目不能再傻逼了... Code: /*=============================== ...
- 初识CDQ分治
[BZOJ 1176:单点修改,查询子矩阵和]: 1176: [Balkan2007]Mokia Time Limit: 30 Sec Memory Limit: 162 MBSubmit: 200 ...
- HDU5322 Hope(DP + CDQ分治 + NTT)
题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5322 Description Hope is a good thing, which can ...
随机推荐
- urllib库
python内置的最基本的HTTP请求库,有以下四个模块: urllib.request 请求模块 urllib.error 异常处理模块 urllib.parse url解析模块 urllib.ro ...
- Linux 光盘挂载步骤
mount -t fs_type device dir 挂载操作 常见的文件系统类型 Windows :ntfs.fat32 Linux:ext3.ext4.xfs 光盘: iso9660 挂载光盘: ...
- mysql异常:Packet for query is too large (10240 > 1024). You can change this value
出现这个问题的原因是:mysql的配置文件中 max_allowed_packet 设置过小,mysql根据配置文件会限制server接受的数据包大小. 还有人会说我操作的数据量明显没有超过这个值为啥 ...
- [转帖]关于CP936
来源: 知乎:https://www.zhihu.com/question/35609295/answer/63780022 CP936和UTF-8本身和Python是毫无关联的. CP936其实就是 ...
- Latex常用软件
Linux texMaker sudo apt-get install texlive-full sudo apt-get install texmaker
- laravel 项目表单中有csrf_token,但一直报错419错误 解决redis连接错误:MISCONF Redis is configured to save RDB snapshots, but it is currently not able to persi
laravel 项目表单中有csrf_token,但一直报错419错误,因为项目中使用到Redis缓存,在强制关闭Redis后出现的问题,查询laravel.log文件查找相关问题 安装redis后在 ...
- git客户端下载 和安装
网址 https://git-scm.com/download/win 点击next 说明: (1)图标组件(Addition icons) : 选择是否创建桌面快捷方式. (2)桌面浏览(Wind ...
- html5调用手机摄像头(图片可多选 限pc)
html5自带的 input file=”” ,纯html5,并且不涉及到js ,就可以实现.代码如下: <input type="file" accept="im ...
- 爬虫实战——Scrapy爬取伯乐在线所有文章
Scrapy简单介绍及爬取伯乐在线所有文章 一.简说安装相关环境及依赖包 1.安装Python(2或3都行,我这里用的是3) 2.虚拟环境搭建: 依赖包:virtualenv,virtualenvwr ...
- rsync: chgrp "/.hosts.NBCxBB" (in test) failed: Operation not permitted (1)
#记一次rsync出现的错误(网上基本都是说权限问题) #这并不是权限的问题,应为实际的文件已经传过去了,但是rsync就是会报这个错误,(虽然使用是正常的,但是看着就是不爽) [root@local ...