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 ...
随机推荐
- 软件工程练习:模块化,单元测试,回归测试,TDD
这是<构建之法>实战教学的一部分.适合作为同学们的第二个程序作业. 第一个程序作业: 请看 “概论” 一章的练习,或者老师的题目,例如这个. 作业要求: 软件工程的作业越来越有意思了, 我 ...
- Largest Rectangle in a Histogram HDU - 1506 (单调栈)
A histogram is a polygon composed of a sequence of rectangles aligned at a common base line. The rec ...
- p151开映射札记
1. 如何理解这句话? 2.连续有什么用? 3.为什么区间包含,经过算子T还是包含? 谢谢 谢谢学长 我懂了 1.2. 3有点儿模糊 1.连续等价于开集原像是开集,而可逆算子的逆的原像就是的 ...
- debian下 Hadoop 1.0.4 集群配置及运行WordCount
说明:我用的是压缩包安装,不是安装包 官网安装说明:http://hadoop.apache.org/docs/r1.1.2/cluster_setup.html,繁冗,看的眼花...大部分人应该都不 ...
- [options] 未与 -source 1.6 一起设置引导类路径
用ant与eclipse编译Cassandra 1.2.19,出现了“ [options] 未与 -source1.6一起设置引导类路径”的警告,并出现了一些编译错误,提示编译失败,上网找了很 多资料 ...
- Vue-router路由使用,单页面的实现
1.安装路由系统 NPM npm install vue-router 2.在main.js中进入引用 import VueRouter from 'vue-router' 3.创建三个空的组件: V ...
- 现代程序设计 homework-06
写代码爽还是读代码爽? 当然是写代码爽好吧... 读代码明显是读+写两倍的工作量好么... 本次作业要求: 1) 把程序编译通过, 跑起来. 读懂程序,在你觉得比较难懂的地方加上一些注释,这样大家就能 ...
- jmeter之批量修改请求路径
今天工作时碰到一个问题:测试环境中由于tomcat没指定webapps下的文件夹名,导致tomcat使用了webapps下默认的文件夹名,而我的jmeter脚本都已经做出来了,一共83个接口,挨个改路 ...
- TortoiseGit push免输密码
(ฅ>ω<*ฅ) 噫又好了~ TortoiseGit push免输密码的方法 – 晨旭的博客~https://www.chenxublog.com/2016/03/04/tortoiseg ...
- VS如何在调试时进入到dll文件
背景: 项目A:用C#写的一个类库文件 项目B:引用项目A的dll文件,完成编码,也是C#编写的. 需求:怎么能在调试的时候,调试断点能够从项目B中进入项目A中的代码. 解决办法就是: 假设,项 ...