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. 【Python】python2 str 编码检测

    python2 str 编码检测 import chardet s = 'sdffdfd' print type(s) print chardet.detect(s) s2 = '反反复复' prin ...

  2. aar、jar、so的引入和aar打包包含so、aar、jar文件

    so依赖   1,先建本地仓库,指向so放置的目录

  3. 【extjs6学习笔记】1.11 初始: config

    Ext JS有一个名为config的功能. 该配置允许您使用默认值声明公共属性,这些属性将被其他类成员完全封装. 通过config声明的属性将自动获取get()和set()方法,如果类没有定义这些方法 ...

  4. 本地eclipse启动tomcat后无法访问

    转自博文:http://blog.csdn.net/wqjsir/article/details/7169838/ 症状: tomcat在eclipse里面能正常启动,而在浏览器中访问http://l ...

  5. 浅谈Scrum敏捷开发:4个输入/输出、3个关键物、3个会议

    文章对Scrum敏捷开发流程进行系统的分析,希望借此文能够加深你对敏捷开发的认知,更好的展开产品工作. Scrum敏捷开发,是一种敏捷开发框架,是一个增量的.迭代的开发过程,具备可视.可集成和可运行使 ...

  6. COGS 201. [BYVoid S1] 埃雷萨拉斯的宝藏

    ★★   输入文件:eldrethalas.in   输出文件:eldrethalas.out   简单对比时间限制:1 s   内存限制:256 MB 问题描述 一万两千年前,精灵还是在艾萨拉女王的 ...

  7. 远程登录事件ID

    4672.4624 删除本机记录 HKEY_CURRENT_USER \ Software\Microsoft  \ Terminal ServerClientDefault: 删除“此电脑\文档”下 ...

  8. linux 命令——13 less(转)

    less 工 具也是对文件或其它输出进行分页显示的工具,应该说是linux正统查看文件内容的工具,功能极其强大.less 的用法比起 more 更加的有弹性. 在 more 的时候,我们并没有办法向前 ...

  9. RobotFramework:钉钉扫码登录UI自动化

    背景: 遇到一个项目,使用的是钉钉扫码登录,一时间不知道该怎么下手了,还是先F12抓包看下都有什么数据传输吧. 分析: 先熟悉下钉钉扫码登录的逻辑,参考官文:https://open-doc.ding ...

  10. 深入理解计算机系统_3e 第十一章家庭作业 CS:APP3e chapter 11 homework

    注:tiny.c csapp.c csapp.h等示例代码均可在Code Examples获取 11.6 A. 书上写的示例代码已经完成了大部分工作:doit函数中的printf("%s&q ...