3085 吃遍赴丝码(分治)

3085 吃遍赴丝码

给定一个长度为nnn的数组,求∑i=1n∑j=in(j−i+1)×min{ai,…,aj}×max{ai,…,aj}\sum\limits_{i = 1} ^{n} \sum\limits_{j = i} ^{n} (j - i + 1) \times min\{a_i, \dots, a_j\} \times max\{a_i, \dots, a_j\}i=1nj=in(ji+1)×min{ai,,aj}×max{ai,,aj}

考虑分治求解,f(l,mid),f(mid+1,r)f(l, mid), f(mid + 1, r)f(l,mid),f(mid+1,r),返回的是区间[l,mid],[mid+1,r][l, mid], [mid + 1, r][l,mid],[mid+1,r]的值,考虑两个区间合并的时候如何计算。

我们考虑枚举左端点i∈[l,mid]i \in [l, mid]i[l,mid]j∈[mid+1,r]j \in [mid + 1, r]j[mid+1,r],设maxn=max{ai,…amid},minn=min{ai,…,amid}maxn = max\{a_i, \dots a_{mid}\}, minn = min\{a_i, \dots, a_{mid}\}maxn=max{ai,amid},minn=min{ai,,amid}

我们在区间[mid+1,r][mid + 1, r][mid+1,r]上找到,最靠右的p1p_1p1,满足min{amid+1,…,ap1}≥minnmin\{a_{mid + 1}, \dots, a_{p_1}\} \ge minnmin{amid+1,,ap1}minn

同样在区间[mid+1,r][mid + 1, r][mid+1,r]上找打,最靠右的p2p_2p2,满足max{amid+1,…,ap2}≤maxnmax\{a_{mid + 1}, \dots, a_{p_2} \} \le maxnmax{amid+1,,ap2}maxn

我们假设p1≤p2p_1 \le p_2p1p2,则我们可以把区间[mid+1,r][mid + 1, r][mid+1,r]分成三个部分[mid+1,p1],[p1+1,p2],[p2+1,r][mid + 1, p_1], [p_1 + 1, p_2], [p_2 + 1, r][mid+1,p1],[p1+1,p2],[p2+1,r]

则在第一段j∈[mid+1,p1]j \in [mid + 1, p_1]j[mid+1,p1]上显然有min{ai,…,aj}=minn,max{ai,…,aj}=maxnmin\{a_i, \dots, a_j\} = minn, max\{a_i, \dots, a_j\} = maxnmin{ai,,aj}=minn,max{ai,,aj}=maxn

即答案为minn×maxn×∑j=mid+1p1j−i+1minn \times maxn \times \sum\limits_{j = mid + 1} ^{p_1}j - i + 1minn×maxn×j=mid+1p1ji+1

则在第二段j∈[p1+1,p2]j \in[p_1 + 1, p_2]j[p1+1,p2]上显然有max{ai,…,aj}=maxnmax\{a_i, \dots, a_j\} = maxnmax{ai,,aj}=maxn,区间minminmin则是[mid+1,j][mid + 1, j][mid+1,j]的最小值了,可以考虑记录一个前缀minminmin

即答案为maxn×∑j=p1+1p2(j−i+1)×min[j]maxn \times \sum\limits_{j = p_1 + 1} ^{p_2} (j - i + 1) \times min[j]maxn×j=p1+1p2(ji+1)×min[j],这个时候只要预处理出前缀∑min[j]×j,∑min[j]\sum min[j] \times j, \sum min[j]min[j]×j,min[j]即可。

如果不满足p1≤p2p_1 \le p_2p1p2,我们可以同理处理∑max[j]×j,∑max[j]\sum max[j] \times j, \sum max[j]max[j]×j,max[j]即可。

则在第三段j∈[p2+1,r]j \in [p_2 + 1, r]j[p2+1,r]上显然有min,maxmin, maxmin,max都在[mid+r,j][mid + r, j][mid+r,j]上,所以考虑记录一个前缀min,maxmin, maxmin,max

即答案为∑j=p2+1r(j−i+1)×min[j]×max[j]\sum\limits_{j = p_2 + 1} ^{r} (j - i + 1) \times min[j] \times max[j]j=p2+1r(ji+1)×min[j]×max[j],预处理出∑min[j]×max[j]×j,∑min[j]×max[j]\sum min[j] \times max[j] \times j, \sum min[j] \times max[j]min[j]×max[j]×j,min[j]×max[j]即可。

综上,我们可以在nlog⁡nn \log nnlogn的时间内得到答案。

#include <bits/stdc++.h>using namespace std;const int N = 5e5 + 10, mod = 1000000000;int a[N], lmin[N], lmax[N], rmin[N], rmax[N], n;int sum1[N], sum2[N], sum3[N], sum4[N], sum5[N], sum6[N];// min * j, min, max * j, max, min * max * j, min * maxinline int add(int x, int y) {return x + y < mod ? x + y : x + y - mod;
}inline int sub(int x, int y) {return x >= y ? x - y : x - y + mod;
}inline int calc(int i, int l, int r) {int fi = l - i + 1, se = r - i + 1, num = r - l + 1;return 1ll * (fi + se) * num / 2 % mod;
}int f(int l, int r) {if (l == r) {return 1ll * a[l] * a[l] % mod;}int mid = l + r >> 1, ans = add(f(l, mid), f(mid + 1, r));// f(l, mid), f(mid + 1, r);// 预处理 [i, mid] 的最小最大值。lmin[mid] = lmax[mid] = a[mid];for (int i = mid - 1; i >= l; i--) {lmin[i] = min(lmin[i + 1], a[i]);lmax[i] = max(lmax[i + 1], a[i]);}// 预处理 [mid + 1, j]的最小最大值。rmin[mid + 1] = rmax[mid + 1] = a[mid + 1];for (int i = mid + 2; i <= r; i++) {rmin[i] = min(rmin[i - 1], a[i]);rmax[i] = max(rmax[i - 1], a[i]);}sum1[mid] = sum2[mid] = sum3[mid] = sum4[mid] = sum5[mid] = sum6[mid] = 0;for (int i = mid + 1; i <= r; i++) {sum1[i] = add(sum1[i - 1], 1ll * i * rmin[i] % mod);sum2[i] = add(sum2[i - 1], rmin[i]);sum3[i] = add(sum3[i - 1], 1ll * i * rmax[i] % mod);sum4[i] = add(sum4[i - 1], rmax[i]);sum5[i] = add(sum5[i - 1], 1ll * i * rmin[i] % mod * rmax[i] % mod);sum6[i] = add(sum6[i - 1], 1ll * rmin[i] * rmax[i] % mod);}int p1 = mid, p2 = mid; // min, max;for (int i = mid; i >= l; i--) {while (p1 < r && rmin[p1 + 1] >= lmin[i]) {p1++;}while (p2 < r && rmax[p2 + 1] <= lmax[i]) {p2++;}// [mid + 1, min(p1, p2)]ans = add(ans, 1ll * lmin[i] * lmax[i] % mod * calc(i, mid + 1, min(p1, p2)) % mod);// [min(p1, p2) + 1, max(p1, p2)]if (p1 < p2) {int l = p1 + 1, r = p2;ans = add(ans, 1ll * lmax[i] * sub(sum1[r], sum1[l - 1]) % mod);ans = sub(ans, 1ll * lmax[i] * (i - 1) % mod * sub(sum2[r], sum2[l - 1]) % mod);}else if (p2 < p1) {int l = p2 + 1, r = p1;ans = add(ans, 1ll * lmin[i] * sub(sum3[r], sum3[l - 1]) % mod);ans = sub(ans, 1ll * lmin[i] * (i - 1) % mod * sub(sum4[r], sum4[l - 1]) % mod);}// [max(p1, p2) + 1, r]int l = max(p1, p2) + 1;ans = add(ans, sub(sum5[r], sum5[l - 1]));ans = sub(ans, 1ll * (i - 1) * sub(sum6[r], sum6[l - 1]) % mod);}return ans;
}int main() {freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);scanf("%d", &n);for (int i = 1; i <= n; i++) {scanf("%d", &a[i]);}printf("%d\n", f(1, n));return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/313655.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

聊聊高并发下库存加减那些事儿——“异步扣减库存”

聊聊高并发下库存加减那些事儿不定期福利发放哦聊聊高并发下库存加减那些事儿背景一般在日常开发中经常会遇到打折促销&#xff0c;秒杀活动&#xff0c;就如拼多多最近的4999抢券买爱疯11促销活动&#xff0c;毕竟谁的钱也不是大风刮来的&#xff0c;有秒杀有促销必定带来大量…

什么是MVC

什么是MVC&#xff1f; MVC全名是Model View Controller&#xff0c;是模型(model)&#xff0d;视图(view)&#xff0d;控制器(controller)的缩写&#xff0c;一种软件设计典范。 用一种业务逻辑、数据、界面显示分离的方法&#xff0c;将业务逻辑聚集到一个部件里面&#xf…

P3242 [HNOI2015] 接水果(整体二分、扫描线)

P3242 [HNOI2015] 接水果 给定一棵树&#xff0c;定义给定了ppp个盘子&#xff0c;每个盘子是树上u,vu, vu,v两点的路径&#xff0c;且盘子有权值&#xff0c;定义水果&#xff0c;水果也是树上u,vu, vu,v两点间的路径。 有qqq个询问&#xff0c;每次给定u,v,ku, v, ku,v,k&a…

SpringMVC 、Struts的区别

先说结论&#xff1a;目前Spring MVC已经一统江山&#xff0c;Struts正在被抛弃 1、Spring MVC原理 Spring 体系&#xff1a; Spring MVC工作流程图 SpringMVC的工作流程描述 1. 用户向服务器发送请求&#xff0c;请求被Spring前端控制Servelt DispatcherServlet捕获&#x…

P3700 [CQOI2017]小Q的表格(反演、分块)

P3700 [CQOI2017]小Q的表格 给定一个大小为nnn \times nnn的表格&#xff0c;初始时i,ji, ji,j位置上填的是f(i,j)ijf(i, j) i \times jf(i,j)ij&#xff0c;有mmm个操作&#xff0c;每次操作给定a,b,x,ka, b, x, ka,b,x,k&#xff0c;把格子a,ba, ba,b上的值改成xxx&#xf…

基于Asp.Net Core MVC和AdminLTE的响应式管理后台之侧边栏处理

说明&#xff1a;.NET Core版本为:2.2 AdminLTE版本为:2.4.18 Bootstrap版本为:3.4.1 font-awesome版本为:4.7.01、新建项目&#xff1a;AdminLteDemo&#xff0c;添加区域Admin 在Areas/Admin/Views文件夹添加文件并分别添加如下代码&#xff1a;_ViewImports.cshtmladdTagHel…

Spring boot——起步依赖

一、起步依赖 1、是什么 本质上是一个Maven项目对象模型&#xff08;Project Object Model&#xff0c; POM&#xff09;&#xff0c; 定义了对其他库的传递依赖&#xff0c;这些东西加在一起即支持某项功能。 比如&#xff1a; spring-boot-dependencies^ spring-boot-pare…

[翻译] ASP.NET Core 3.0 的新增功能

全文翻译自微软官方文档英文版 Whats new in ASP.NET Core 3.0本文重点介绍了 ASP.NET Core 3.0 中最重要的更改&#xff0c;并提供相关文档的连接。BlazorBlazor 是 ASP.NET Core 中的一个新的框架&#xff0c;用于使用 .NET 构建交互式的客户端 Web UI&#xff1a;使用 C# 而…

Convolution(2021牛客暑期多校训练营4)

Convolution 定义a⊕babgcd⁡(a,b)2a \oplus b \frac{a \times b}{\gcd(a, b) ^ 2}a⊕bgcd(a,b)2ab​&#xff0c;bm∑i1n∑j1naijc[i⊕jm]b_m \sum\limits_{i 1} ^{n} \sum\limits_{j 1} ^{n}a_i \times j ^ c [i \oplus j m]bm​i1∑n​j1∑n​ai​jc[i⊕jm]&#xff0…

Sprig boot自动配置

1、概述 Spring Boot是Spring旗下众多的子项目之一&#xff0c;其理念是约定优于配置&#xff0c;它通过实现了自动配置&#xff08;大多数用户平时习惯设置的配置作为默认配置&#xff09;的功能来为用户快速构建出标准化的应用。Spring Boot的特点可以概述为如下几点&#x…

E. Mocha and Stars(莫比乌斯反演、简单dp)

E. Mocha and Stars ∑a1l1r1∑a2l2r2⋯∑anlnrn[a1a2⋯an≤m][gcd⁡(a1,a2,…,an)1]\sum_{a_1 l_1} ^{r_1} \sum_{a_2 l_2} ^{r_2} \dots \sum_{a_n l_n} ^{r_n} [a_1 a_2 \dots a_n \le m][\gcd(a_1, a_2, \dots, a_n) 1]\\ a1​l1​∑r1​​a2​l2​∑r2​​⋯an​ln…

.NET Core 3.0稳定版发布

一年一度的 .NET 开发者盛会 .NET Conf 2019 已正式开始了&#xff08;举办时间为 9.23-9.25&#xff09;。大会第一天最重磅也是最激动人心的消息莫过于 .NET Core 3.0 稳定版的发布。.NET 项目管理总监 Scott Hunter 在大会宣布了这则消息&#xff0c;并在主题演讲环节围绕 .…

深入理解 Spring Boot Starters 原理(手写Spring boot Start)

一、Spring Boot Starter诞生原因 Spring Boot Starter是在SpringBoot组件中被提出来的一种概念&#xff0c;stackoverflow上面已经有人概括了这个starter是什么东西&#xff0c;想看完整的回答戳这里 Starter POMs are a set of convenient dependency descriptors that you …

FFT字符串匹配(解决通配符问题)

FFT字符串匹配 定义字符串下标从000&#xff0c;开始&#xff0c;有文本串AAA长度为nnn&#xff0c;模式串BBB长度为mmm&#xff0c;我们可以考虑一个函数f(x,y)A(x)−B(y)f(x, y) A(x) - B(y)f(x,y)A(x)−B(y)。 我们设F(x)(x≥m−1)∑i0m−1f(x−m1i,i)F(x)(x \ge m - 1) …

记一次中小公司的研发问题

作者&#xff1a;zollty&#xff0c;资深程序员和架构师&#xff0c;私底下是个爱折腾的技术极客&#xff0c;架构师社区合伙人&#xff01;一、一些不好的现状&#xff0c;及对应的改进方法1、前后端代码绑定在一起&#xff0c;很难维护&#xff0c;前端UI做得太差&#xff0c…

命令行操作mysql

1、通过命令行连接mysql&#xff1a; 1、输入命令&#xff1a;mysql -h localhost&#xff08;服务IP地址&#xff09; -u root&#xff08;用户名&#xff09; -P 3306&#xff08;服务端口&#xff09;-p 2、输入密码 2、显示数据库、表&#xff1a; show databases; //…

2021CCPC华为云挑战赛:HDU 7091 重叠的子串(SAM + 线段树合并)

重叠的子串 给定一个长度为n(1≤∣s∣≤105)n(1 \le \mid s \mid \le 10 ^ 5)n(1≤∣s∣≤105)的只由小写字母构成的字符串sss&#xff0c;有m,(1≤m≤106)m, (1 \le m \le 10 ^ 6)m,(1≤m≤106)个询问&#xff1a; 每次询问给定l,rl, rl,r&#xff0c;问sss是否存在一个字串…

ASP.NET Core 3.0 使用gRPC

一.简介gRPC 是一个由Google开源的&#xff0c;跨语言的&#xff0c;高性能的远程过程调用&#xff08;RPC&#xff09;框架。gRPC使客户端和服务端应用程序可以透明地进行通信&#xff0c;并简化了连接系统的构建。它使用HTTP/2作为通信协议&#xff0c;使用 Protocol Buffers…

mysql 1030 error:Got error 28 from storage engine

最近生产应用连不上生产环境数据库&#xff0c;使用命令行连上去之后&#xff0c;执行命令出现1030 error。 故Google之&#xff0c;解决方案如下。 mysql 1030 error 是因为没有足够的空间&#xff0c;清理磁盘空间即可恢复正常使用。 然后追踪发现&#xff0c;磁盘空间为99G&…

Codeforces Round #739 (Div. 3)(AK实况)

Codeforces Round #739 (Div. 3) A. Dislike of Threes 找到第kkk个既不是333的倍数&#xff0c;个位数上也不是333的数&#xff0c;也已预处理然后O(1)O(1)O(1)输出&#xff0c;也可直接forforfor循环暴力。 #include <bits/stdc.h>using namespace std;int main() {/…