【HNOI2016】序列【莫队】【单调栈】【ST表】

题意:给定序列 aia_iaiqqq 次询问 [l,r][l,r][l,r] 所有子区间最小值之和。

n,q≤105n,q\leq 10^5n,q105

这种题一眼看上去是离线线段树,但这题每移动一位要维护区间取 min⁡\minmin,历史值之和,非常不可做。

所以考虑莫队。

考虑移动一位产生的贡献。以向右扩展一位为例,我们要求的是这个东西:

∑i=lrrmq⁡(i,r+1)\sum_{i=l}^r\operatorname{rmq}(i,r+1)i=lrrmq(i,r+1)

这显然是个单调栈的形式。维护单调栈内的所有贡献,但十分精神污染,并且单调栈既不能删除也不能撤销,


智商分割线


考虑我们要求的到底是什么。设 preipre_ipreiiii 前面最后一个比它小的数的位置,那么这个数产生的贡献是 ai(i−prei)a_i(i-pre_i)ai(iprei)

而这么下去只有单调栈中的第一个,也就是区间最小值产生的贡献是不完整的。维护一个以 preipre_ipreifafafa 数组的树的树上前缀和,然后 ST 表查到最小值,把多余的部分减掉即可。

复杂度 O(nlog⁡n+mlog⁡m+nm)\Omicron(n\log n+m\log m+n\sqrt m)O(nlogn+mlogm+nm)

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cctype>
#include <cmath>
#include <algorithm>
#define MAXN 100005
using namespace std;
typedef long long ll;
inline int read()
{int ans=0,f=1;char c=getchar();while (!isdigit(c)) (c=='-')&&(f=-1),c=getchar();while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();return f*ans;
}
int a[MAXN],pre[MAXN],suf[MAXN],stk[MAXN],tp;
int st[MAXN][20],LOG[MAXN];
ll psum[MAXN],ssum[MAXN];
inline int Min(const int& x,const int& y){return a[x]<a[y]? x:y;}
inline int rmq(int l,int r)
{int t=LOG[r-l+1];return Min(st[l][t],st[r-(1<<t)+1][t]);
}
inline ll calcL(int l,int r)
{int pos=rmq(l-1,r);return ssum[l-1]-ssum[suf[pos]]-(ll)(suf[pos]-r-1)*a[pos];
}
inline ll calcR(int l,int r)
{int pos=rmq(l,r+1);return psum[r+1]-psum[pre[pos]]-(ll)(l-pre[pos]-1)*a[pos];
}
int B;
struct query{int l,r,pos;}q[MAXN];
inline bool operator <(const query& a,const query& b){return a.l/B==b.l/B? a.r<b.r:a.l<b.l;}
ll res[MAXN];
int main()
{int n,m;n=read(),m=read();LOG[0]=-1;for (int i=1;i<=n;i++) LOG[i]=LOG[i>>1]+1;for (int i=1;i<=n;i++) a[st[i][0]=i]=read();for (int j=1;j<20;j++)for (int i=1;i+(1<<(j-1))<=n;i++)st[i][j]=Min(st[i][j-1],st[i+(1<<(j-1))][j-1]);for (int i=1;i<=n;i++){while (tp&&a[i]<a[stk[tp]]) --tp;pre[i]=stk[tp],psum[i]=psum[stk[tp]]+(ll)(i-stk[tp])*a[i],stk[++tp]=i;}tp=0;stk[0]=n+1;for (int i=n;i>=1;i--){while (tp&&a[i]<a[stk[tp]]) --tp;suf[i]=stk[tp],ssum[i]=ssum[stk[tp]]+(ll)(stk[tp]-i)*a[i],stk[++tp]=i;}B=sqrt(n);for (int i=1;i<=m;i++) q[i].l=read(),q[i].r=read(),q[i].pos=i;sort(q+1,q+m+1);int l=1,r=0;ll sum=0;for (int i=1;i<=m;i++){while (r<q[i].r) sum+=calcR(l,r++);while (l>q[i].l) sum+=calcL(l--,r);while (r>q[i].r) sum-=calcR(l,--r);while (l<q[i].l) sum-=calcL(++l,r);res[q[i].pos]=sum;}for (int i=1;i<=m;i++) printf("%lld\n",res[i]);return 0;
}

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

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

相关文章

湖南大学第十六届程序设计竞赛 B Yuki with emofunc and playf 同余最短路

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 初始有一个数111&#xff0c;你每次可以将其∗10*10∗10或者(x−1)(x-1)(x−1)&#xff0c;现在给你xxx&#xff0c;问最少经过多少步能到达nnn。 1≤n≤1e6,1≤m≤1e91\le n\le1e6,1\le m\le1e91≤n≤1e6,1…

【HNOI2019】白兔之舞【组合数学】【矩阵快速幂】【单位根反演】【Chirp Z-Transform】【原根】【MTT】

题意&#xff1a;有一张 (L1)n(L1)\times n(L1)n 个点的有向图&#xff0c;每个结点有二元组 (x,y)(0≤x≤L,1≤y≤n)(x,y)~(0\leq x\leq L,1\leq y\leq n)(x,y) (0≤x≤L,1≤y≤n) 表示。对于所有 (u1,v1),(u2,v2)(u_1,v_1),(u_2,v_2)(u1​,v1​),(u2​,v2​)&#xff0c;若 u…

程序员如何学习英语

首先&#xff0c;这不是一篇广告&#xff0c;虽然这个标题很像。其次&#xff0c;我的英语水平也很一般&#xff0c;所以更多的是谈谈一些失败的经历和思考&#xff0c;俗话说&#xff0c;成功的经验不可复制&#xff0c;失败的经验倒可以让我们少走弯路。英语的重要性毋庸置疑…

Educational Codeforces Round 111 (Rated for Div. 2) D. Excellent Arrays 组合数学

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你一个数组aia_iai​&#xff0c;定义一个数组是好的当且仅当对于所有iii都有ai!ia_i!iai​!i。定义f(a)f(a)f(a)表示数组aaa中i<j,aiajiji<j,a_ia_jiji<j,ai​aj​ij的(i,j)(i,j)(i,j)对数。定义…

使用Azure云原生构建博客是怎样一种体验?(上篇)

点击上方蓝字关注“汪宇杰博客”导语https://edi.wang我的网站是在.NET Core 平台上使用 C#语言编写的开源博客系统&#xff0c;运行于微软智慧云 Azure 国际版上。本文将重点介绍 Azure 的各项服务如何为博客带来丝滑体验与保驾护航。历史回顾我博客的历史可以追溯到2003年&am…

AtCoder Regular Contest 100 D - Equal Cut 思维 + 前缀和

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你一个数组aaa&#xff0c;你要将其分成四份&#xff0c;让这四份中和的最大值−-−最小值最小&#xff0c;输出这个最小值。 n≤2e5,ai≤1e9n\le2e5,a_i\le1e9n≤2e5,ai​≤1e9 思路&#xff1a; 直接枚…

【UOJ574】多线程计算【二元二项式反演】【定积分】【矩阵】【NTT 卷积】

题意&#xff1a;有 nmn\times mnm 的网格&#xff0c;每个结点在 [0,1)[0,1)[0,1) 内的一个随机时刻被点亮。有 hhh 个数对 xi,yix_i,y_ixi​,yi​&#xff0c;对于一个瞬间状态&#xff0c;如果存在一个 xi,yix_i,y_ixi​,yi​ 使得恰好有 xix_ixi​ 行 yiy_iyi​ 列被点亮&a…

Orleans 知多少 | 2. 核心概念一览

Orleans 术语解读上面这张图中包含了Orleans中的几个核心概念&#xff1a;GrainSiloOrleans ClusterOrleans Client从这张图&#xff0c;我们应该能理清他们之间的关系。Grain作为最小的执行单元Silo 是 Grain 的宿主运行环境&#xff0c;用来暴露具体的服务Orleans Server 提供…

Codeforces Round #587 (Div. 3) C. White Sheet 思维

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你一个白色的矩形和俩个黑色的矩形&#xff0c;问白色被黑色覆盖后还能不能看到。 思路&#xff1a; 经典被简单题卡。 一开始写了个自我感觉很对的做法&#xff0c;结果wa41wa41wa41&#xff0c;检查不…

【UOJ575】光伏元件【网络流建图】【上下界网络流】【费用流】

题意&#xff1a; nnn\times nnn 的 01 矩阵&#xff0c;对于 i∈[1,n]i \in [1,n]i∈[1,n] 有三个参数 li,li,kil_i,l_i,k_ili​,li​,ki​&#xff0c;表示第 iii 行&#xff0c;第 iii 列的 111 的个数分别在 [li,ri][l_i,r_i][li​,ri​] 中&#xff0c;且差的绝对值不超过…

动手造轮子:实现一个简单的 EventBus

动手造轮子&#xff1a;实现一个简单的 EventBusIntroEventBus 是一种事件发布订阅模式&#xff0c;通过 EventBus 我们可以很方便的实现解耦&#xff0c;将事件的发起和事件的处理的很好的分隔开来&#xff0c;很好的实现解耦。微软官方的示例项目 EShopOnContainers 也有在使…

Codeforces Round #733 (Div. 1 + Div. 2) E. Minimax 分情况讨论 + 思维

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你一个串&#xff0c;你可以随意安排这个串&#xff0c;使得这个串的每个前缀的kmpkmpkmp数组最大值最小&#xff0c;定义为f(a)f(a)f(a)&#xff0c;并且字典序最小&#xff0c;输出安排之后的串。 n≤1e…

【Ynoi2011】成都七中【树论】【点分树】【离线】【树状数组】

题意&#xff1a;给一棵树&#xff0c;点有颜色&#xff0c;qqq 次询问&#xff0c;每次给定 l,r,xl,r,xl,r,x &#xff0c;求只保留编号在 [l,r][l,r][l,r] 中的点时点 xxx 所在连通块的颜色数。 所有数 ≤105\leq 10^5≤105 题目背景好评 首先所有颜色不同的话就是数连通块…

通过 nginx-proxy 实现自动反向代理和 HTTPS

本章节代码已经上传至 https://github.com/siegrainwong/.NET-Core-with-Docker/tree/master/Part3系列大纲这次我们讲第三篇&#xff1a;用 docker-compose 启动 WebApi 和 SQL Server在容器中集成 Skywalking APM通过 nginx-proxy 对 Portainer、Skywalking、WebApi 实现自动…

P4781 【模板】拉格朗日插值

传送门 把公式实现一下即可&#xff1a; 当xxx连续的时候可以优化为O(N)O(N)O(N)。 // Problem: P4781 【模板】拉格朗日插值 // Contest: Luogu // URL: https://www.luogu.com.cn/problem/P4781 // Memory Limit: 125 MB // Time Limit: 1000 ms // // Powered by CP Edi…

【HNOI/AHOI2018】毒瘤【容斥】【虚树/动态dp】

题意&#xff1a;nnn 个点 mmm 条边的连通无向图的独立集个数模 998244353998244353998244353。 n≤105,m≤n10n\leq 10^5,m\leq n10n≤105,m≤n10 为什么标题要把两个算法写一起&#xff1f;因为这两个东西在这类问题上是本质相同的&#xff0c;这也是写这篇博客的原因。 显…

MediatR-进程内的消息通信框架

MediatR是一款进程内的消息订阅、发布框架&#xff0c;提供了Send方法用于发布到单个处理程序、Publish方法发布到多个处理程序&#xff0c;使用起来非常方便。目前支持 .NET Framework4.5、.NET Stardand1.3、.NET Stardand2.0等版本&#xff0c;可跨平台使用。要在项目中使用…

Codeforces Round #586 (Div. 1 + Div. 2) D. Alex and Julian 数学 + 思维

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你一个无限个点的坐标轴&#xff0c;一个集合BBB&#xff0c;如果存在∣i−j∣bk|i-j|b_k∣i−j∣bk​的话&#xff0c;那么i,ji,ji,j之间就连边。现在问你至少要从集合BBB中去掉多少个数才能使得连完边之…

【十二省联考2019】字符串问题【后缀自动机】【拓扑排序】

题意&#xff1a;给一个字符串 SSS&#xff0c;以子串的形式给出一些 A 类串和 B 类串以及 mmm 对 A 类串支配 B 类串的关系。求一个总长度最长的 A 类串序列&#xff0c;使得每个串都存在一个 B 类串前缀被后一个串支配。无穷输出 −1-1−1。 ∣S∣,m≤2105|S|,m\leq 2\times …

Codeforces Round #586 (Div. 1 + Div. 2) B. Multiplication Table 思维 + 公式

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你一个n∗nn*nn∗n的矩阵&#xff0c;每个位置由ai∗aja_i*a_jai​∗aj​得来&#xff0c;主对角线为000&#xff0c;让你求出来aia_iai​。 n≤1e3n\le1e3n≤1e3 思路&#xff1a; 由公式ai,j∗ai,kaj,…