ref

#include <algorithm>
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
typedef long long ll;
int n, q, a[100005], l[100005], r[100005], sta[100005], din, blc, bel[100005], st[100005][19], mii[17], mlg[100005];
ll sl[100005], sr[100005], now, ans[100005];
struct Ques{
int ll, rr, id;
}qu[100005];
bool cmp(Ques x, Ques y){
if(bel[x.ll]!=bel[y.ll]) return bel[x.ll]<bel[y.ll];
if(bel[x.ll]&1) return x.rr<y.rr;
return x.rr>y.rr;
}
int getPos(int x, int y){
int l=mlg[y-x+1], k=y+1-mii[l];
return a[st[x][l]]<a[st[k][l]]?st[x][l]:st[k][l];
}
ll calL(int x, int y){
int p=getPos(x, y);
return (ll)a[p]*(y-p+1)+sr[x]-sr[p];
}
ll calR(int x, int y){
int p=getPos(x, y);
return (ll)a[p]*(p-x+1)+sl[y]-sl[p];
}
int main(){//freopen("sequence9.in", "r", stdin);
cin>>n>>q;
blc = sqrt(n);
for(int i=1; i<=n; i++){
scanf("%d", &a[i]);
bel[i] = (i - 1) / blc + 1;
st[i][0] = i;
}
for(int i=1; i<=q; i++){
scanf("%d %d", &qu[i].ll, &qu[i].rr);
qu[i].id = i;
}
sort(qu+1, qu+1+q, cmp);
for(int i=1; i<=n; i++){
while(din && a[sta[din]]>=a[i]) din--;
if(din) l[i] = sta[din];
sta[++din] = i;
}
din = 0;
for(int i=n; i; i--){
r[i] = n + 1;
while(din && a[sta[din]]>=a[i]) din--;
if(din) r[i] = sta[din];
sta[++din] = i;
}
mii[0] = 1;
for(int i=1; i<=16; i++)
mii[i] = mii[i-1] << 1;
for(int i=2; i<=n; i++)
mlg[i] = mlg[i>>1] + 1;
for(int j=1; j<=16; j++)
for(int i=1; i<=n; i++){
st[i][j] = st[i][j-1];
int k=i+mii[j-1];
if(k<=n) st[i][j] = (a[st[i][j-1]]<a[st[k][j-1]])?st[i][j-1]:st[k][j-1];
}
for(int i=1; i<=n; i++)
sl[i] = sl[l[i]] + (ll)(i - l[i]) * a[i];
for(int i=n; i; i--)
sr[i] = sr[r[i]] + (ll)(r[i] - i) * a[i];
int gtl=qu[1].ll, zzh=gtl-1;
for(int i=1; i<=q; i++){
while(gtl>qu[i].ll) now += calL(--gtl, zzh);
while(zzh<qu[i].rr) now += calR(gtl, ++zzh);
while(gtl<qu[i].ll) now -= calL(gtl++, zzh);
while(zzh>qu[i].rr) now -= calR(gtl, zzh--);
ans[qu[i].id] = now;
}
for(int i=1; i<=q; i++)
printf("%lld\n", ans[i]);
return 0;
}

loj2051 「HNOI2016」序列的更多相关文章

  1. 「HNOI2016」序列 解题报告

    「HNOI2016」序列 有一些高妙的做法,懒得看 考虑莫队,考虑莫队咋移动区间 然后你在区间内部找一个最小值的位置,假设现在从右边加 最小值左边区间显然可以\(O(1)\),最小值右边的区间是断掉的 ...

  2. loj #2051. 「HNOI2016」序列

    #2051. 「HNOI2016」序列 题目描述 给定长度为 n nn 的序列:a1,a2,⋯,an a_1, a_2, \cdots , a_na​1​​,a​2​​,⋯,a​n​​,记为 a[1: ...

  3. 「HNOI2016」序列

    传送门 Description 有 \(q\) 个询问,每个询问给定两个数\(l\) 和\(r\),求 \(a[l:r]\) 的不同子序列的最小值之和 Solution  校内模拟赛用了这道题,但是莫 ...

  4. 「HNOI2016」数据结构大毒瘤

    真是 \(6\) 道数据结构毒瘤... 开始口胡各种做法... 「HNOI2016」网络 整体二分+树状数组. 开始想了一个大常数 \(O(n\log^2 n)\) 做法,然后就被卡掉了... 发现直 ...

  5. Loj #3059. 「HNOI2019」序列

    Loj #3059. 「HNOI2019」序列 给定一个长度为 \(n\) 的序列 \(A_1, \ldots , A_n\),以及 \(m\) 个操作,每个操作将一个 \(A_i\) 修改为 \(k ...

  6. 「HNOI2016」树 解题报告

    「HNOI2016」树 事毒瘤题... 我一开始以为每次把大树的子树再接给大树,然后死活不知道咋做,心想怕不是个神仙题哦 然后看题解后才发现是把模板树的子树给大树,虽然思维上难度没啥了,但是还是很难写 ...

  7. 「HNOI2016」网络 解题报告

    「HNOI2016」网络 我有一个绝妙的可持久化树套树思路,可惜的是,它的空间是\(n\log^2 n\)的... 注意到对一个询问,我们可以二分答案 然后统计经过这个点大于当前答案的路径条数,如果这 ...

  8. 「HNOI2016」最小公倍数 解题报告

    「HNOI2016」最小公倍数 考虑暴力,对每个询问,处理出\(\le a,\le b\)的与询问点在一起的联通块,然后判断是否是一个联通块,且联通块\(a,b\)最大值是否满足要求. 然后很显然需要 ...

  9. AC日记——「SDOI2017」序列计数 LibreOJ 2002

    「SDOI2017」序列计数 思路: 矩阵快速幂: 代码: #include <bits/stdc++.h> using namespace std; #define mod 201704 ...

随机推荐

  1. 从零开始的全栈工程师——js篇2.11(原型)

    原型 原型分析 1.每个 函数数据类型(普通函数,类)都有一个prototype属性 并且这个属性是一个对象数据类型2.每个Prototype上都有一个constructor属性 并且这个属性值是当前 ...

  2. a标签嵌套a标签效果的两种解决方案

    <!-- a标签进行嵌套的时候 --> <a href="#outer">outerA <a href="#inner">i ...

  3. css禁止文字被选中

    有时候,为了让用户有更好的体验,需要禁用掉文本选中功能 比如:使用a标签模拟按钮,如果不禁用掉文本选中功能,那么双击时会选中文字,用起来很不爽. 多数情况下,只需要使用CSS样式就可以实现这个功能啦: ...

  4. Cygwin 下的 自动安装工具 apt-cyg

    类似 于apt-get 或者 yum Cygwin可以在Windows下使用unix环境Bash和各种功能强大的工具,对于Linux管理员来说不想使用Linux桌面是必备的工具. Cygwin下也有类 ...

  5. HDU2612 BFS

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2612 , 一道比较简单的广搜(BFS)题目. 算法: 设置两个dist[][]数组,记录Y和M到几个K ...

  6. 使用bouncycastle进行DESede/DESeee/AES128/AES192/AES256的加解密

    前言 默认的jdk不支持DESeee的算法,本地化的JDK中配置有拦截规则,可以通过使用bouncycastle的jar包中的DESEngine类来进行DESeee算法的运算. DES的8字节加解密 ...

  7. python_29_三级菜单2

    menu={'河北':{ '石家庄':{ '平山':{ '县城':{}, '寨北':{}, '苏家庄':{}, }, '灵寿':{}, '鹿泉':{} }, }, '北京':{ '昌平':{ '沙河' ...

  8. DeepLearning tutorial(3)MLP多层感知机原理简介+代码详解

    本文介绍多层感知机算法,特别是详细解读其代码实现,基于python theano,代码来自:Multilayer Perceptron,如果你想详细了解多层感知机算法,可以参考:UFLDL教程,或者参 ...

  9. GB MB KB B 关系

    1KB=1024Bytes=2的10次方Bytes 1MB=1024KB=2的20次方Bytes 1GB=1024MB=2的30次方Bytes 1TB=1024GB=2的40次方Bytes

  10. RabbitMQ使用教程(五)如何保证队列里的消息99.99%被消费?

    1. 前情回顾 RabbitMQ使用教程(一)RabbitMQ环境安装配置及Hello World示例 RabbitMQ使用教程(二)RabbitMQ用户管理,角色管理及权限设置 RabbitMQ使用 ...