要命的题目。

写法:分类讨论进行计算。

枚举过每一个\(mid\)的所有区间。对于左端点\(i∈[l, mid - 1]\),向左推并计算\([l,mid]\)范围内的最大\(/\)最小值。

然后右端点\(p\)分三种类型考虑。

  • \(p∈[mid + 1, p1 - 1]\),其中\(p1\)是第一次出现比\(maxw\)大或者比\(minw\)小的数的位置。

  • \(p∈[p1, p2 - 1]\),其中\(p2\)是第二次出现比\(maxw\)大或者比\(minw\)小的数的位置。

  • \(p∈[p2, r]\),\(r\)是当前枚举区间的右端点。

其中情况一高斯求和,情况二和情况三可以化为前缀最大最小值之和\(/\)积带几个系数的形式\(O(N)\)维护。

要命原因:取膜。

两年\(OI\)一场空,_______。

#include <bits/stdc++.h>
using namespace std; typedef long long LL;
const int N = 500000 + 5;
const LL Mod = 1000000000;
#define min(x,y) (x < y ? x : y)
#define max(x,y) (x > y ? x : y)
#define mul(x,y) ((1ll * (x % Mod) * (y % Mod)) % Mod)
#define add(x,y) ((0ll + (x % Mod) + (y % Mod)) % Mod) int n, arr[N]; LL ans; int _maxw[N], _minw[N]; LL mn1[N], mn2[N], mx1[N], mx2[N], mnmx1[N], mnmx2[N]; int get_maxp (int w, int l, int r) {
if (_maxw[r] <= w) return r + 1;
while (l < r) {
int mid = (l + r) >> 1;
if (_maxw[mid] > w) {
r = mid;
} else {
l = mid + 1;
}
}
return r;
} int get_minp (int w, int l, int r) {
if (_minw[r] >= w) return r + 1;
while (l < r) {
int mid = (l + r) >> 1;
if (_minw[mid] < w) {
r = mid;
} else {
l = mid + 1;
}
}
return r;
} void cdq (int l, int r) {
if (l == r) {
ans = add (ans, mul (arr[l], arr[r]));
return;
}
int mid = (l + r) >> 1;
cdq (l, mid + 0);
cdq (mid + 1, r);
int maxw = arr[mid], minw = arr[mid];
mx1[mid - 1] = mx2[mid - 1] = 0;
mn1[mid - 1] = mn2[mid - 1] = 0;
mnmx1[mid - 1] = mnmx2[mid - 1] = 0;
_maxw[mid] = _minw[mid] = arr[mid];
for (int i = mid + 1; i <= r; ++i) {
_maxw[i] = max (_maxw[i - 1], arr[i]);
_minw[i] = min (_minw[i - 1], arr[i]);
}
for (int p = mid; p <= r; ++p) {
mx1[p] = add (mx1[p - 1], mul (_maxw[p], (p + 1)));
mx2[p] = add (mx2[p - 1], _maxw[p]);
mn1[p] = add (mn1[p - 1], mul (_minw[p], (p + 1)));
mn2[p] = add (mn2[p - 1], _minw[p]);
mnmx1[p] = add (mnmx1[p - 1], mul (_maxw[p], mul (_minw[p], (p + 1))));
mnmx2[p] = add (mnmx2[p - 1], mul (_maxw[p], _minw[p]));
}
for (int i = mid; i >= l; --i) {
maxw = max (maxw, arr[i]);
minw = min (minw, arr[i]);
int p1 = get_maxp (maxw, mid + 1, r); // [mid + 1, r]内第一个比maxw大的地方
int p2 = get_minp (minw, mid + 1, r); // [mid + 1, r]内第一个比minw小的地方
if (p1 > p2) swap (p1, p2); // 不关注大小,主要看划分
// cout << p1 << " " << p2 << endl;
ans = add (ans, mul (1ll * (p1 - mid - 1) * (p1 + mid - i * 2 + 2) / 2, mul (minw, maxw))); // Part 1
if (arr[p1] > maxw) {
ans = add (ans, mul (minw, add (add (mx1[p2 - 1], -mx1[p1 - 1]), -mul (i, add (mx2[p2 - 1], -mx2[p1 - 1])))));
} else {
ans = add (ans, mul (maxw, add (add (mn1[p2 - 1], -mn1[p1 - 1]), -mul (i, add (mn2[p2 - 1], -mn2[p1 - 1])))));
}
if (p2 <= r) {
ans = add (ans, add (add (mnmx1[r], -mnmx1[p2 - 1]), -mul (i, add (mnmx2[r], -mnmx2[p2 - 1]))));
}
}
} signed main () {
// freopen ("data.in", "r", stdin);
cin >> n;
for (int i = 1; i <= n; ++i) {
cin >> arr[i];
}
cdq (1, n);
// cout << ans << endl;
cout << (((ans % Mod) + Mod) % Mod) << endl;;
}

BZOJ3745 / SP22343 NORMA2 - Norma 分治,CDQ分治的更多相关文章

  1. 【BZOJ3745】Norma(CDQ分治)

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

  2. [bzoj] 3263 陌上花开 洛谷 P3810 三维偏序|| CDQ分治 && CDQ分治讲解

    原题 定义一个点比另一个点大为当且仅当这个点的三个值分别大于等于另一个点的三个值.每比一个点大就为加一等级,求每个等级的点的数量. 显然的三维偏序问题,CDQ的板子题. CDQ分治: CDQ分治是一种 ...

  3. UOJ #7 NOI2014购票(点分治+cdq分治+斜率优化+动态规划)

    重写一遍很久以前写过的题. 考虑链上的问题.容易想到设f[i]为i到1的最少购票费用,转移有f[i]=min{f[j]+(dep[i]-dep[j])*p[i]+q[i]} (dep[i]-dep[j ...

  4. 点分治&cdq分治 总结

    游荡的孤高灵魂不需要羁绊之处. 洛谷题单 点分治 前置芝士 树的重心 树分治 例题略解 P3806 [模板]点分治1 板子题,先暴力找到整棵树的重心,然后先求出重心到各点的距离,进而算出他所在树的各个 ...

  5. 洛谷SP22343 NORMA2 - Norma(分治,前缀和)

    洛谷题目传送门 这题推式子恶心..... 考虑分治,每次统计跨过\(mid\)的所有区间的答案和.\(i\)从\(mid-1\)到\(l\)枚举,统计以\(i\)为左端点的所有区间. 我们先维护好\( ...

  6. [BZOJ3672][Noi2014]购票 斜率优化+点分治+cdq分治

    3672: [Noi2014]购票 Time Limit: 30 Sec  Memory Limit: 512 MBSubmit: 1749  Solved: 885[Submit][Status][ ...

  7. 【BZOJ4237】稻草人(CDQ分治,单调栈)

    [BZOJ4237]稻草人(CDQ分治,单调栈) 题面 BZOJ 题解 \(CDQ\)分治好题呀 假设固定一个左下角的点 那么,我们可以找到的右下角长什么样子??? 发现什么? 在右侧是一个单调递减的 ...

  8. 一篇自己都看不懂的CDQ分治&整体二分学习笔记

    作为一个永不咕咕咕的博主,我来更笔记辣qaq CDQ分治 CDQ分治的思想还是比较简单的.它的基本流程是: \(1.\)将所有修改操作和查询操作按照时间顺序并在一起,形成一段序列.显然,会影响查询操作 ...

  9. 浅谈CDQ分治与偏序问题

    初识CDQ分治 CDQ分治是一个好东西,一直听着dalao们说所以就去学了下. CDQ分治是我们处理各类问题的重要武器.它的优势在于可以顶替复杂的高级数据结构,而且常数比较小:缺点在于必须离线操作. ...

随机推荐

  1. Golang基础(6):go的net/http用法

    http包提供了HTTP客户端和服务端的实现 一:http客户端的几种方法 1. func (c *Client) Get(url string) (resp *Response, err error ...

  2. Tensorflow 对上一节神经网络模型的优化

    本节涉及的知识点: 1.在程序中查看变量的取值 2.张量 3.用张量重新组织输入数据 4.简化的神经网络模型 5.标量.多维数组 6.在TensorFlow中查看和设定张量的形态 7.用softmax ...

  3. 一文搞懂HTTP和HTTPS协议

    1.什么是协议? 网络协议是计算机之间为了实现网络通信而达成的一种"约定"或者"规则",有了这种"约定",不同厂商的生产设备,以及不同操作系 ...

  4. ELK+Kafka日志收集环境搭建

    1.搭建Elasticsearch环境并测试: (1)删除es的容器 (2)删除es的镜像 (3)宿主机调内存: 执行命令:sudo sysctl -w vm.max_map_count=655360 ...

  5. 2019/12.09centos安装 | 无密钥登陆

    centos配置 1.安装位置选择(我要配置分区) →完成 2.添加新挂载点:/boot  400M /swap 4GB / 期望容量空 3.设置root密码:字母+数字 4.重启 5.点击编辑,NA ...

  6. python 并发编程 协程 目录

    python 并发编程 协程 协程介绍 python 并发编程 协程 greenlet模块 python 并发编程 协程 gevent模块 python 并发编程 基于gevent模块实现并发的套接字 ...

  7. python 并发编程 多进程 生产者消费者模型总结

    生产者消费者模型总结 生产者消费者模型什么时候用? 1.程序中有两类角色 一类负责生产数据(生产者) 一类负责处理数据(消费者) 2.引入生产者消费者模型为了解决的问题是 平衡生产者与消费者之间的速度 ...

  8. 2019JAVA第十次实验报告

    Java实验报告 班级 计科二班 学号 20188442 姓名 吴怡君 完成时间 2019.11.15 评分等级 实验代码 package Domon9; import java.awt.Font; ...

  9. c语言1作业07

    这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/CST2019-4/homework/9932 我在这个课程的目 ...

  10. airflow部署

    官网: http://airflow.apache.org/installation.html 原理: https://www.cnblogs.com/cord/p/9450910.html 安装: ...