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. HDU5152 线段树 + 数论

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5152 ,线段树区间更新 + 点更新 + 数论知识(数论是重点QAQ),好题值得一做. BestCode ...

  2. shiro无法进入授权的方法org.crazycake.shiro.exception.PrincipalInstanceException: class java.util.HashMap must has getter for field: id

    rg.crazycake.shiro.exception.PrincipalInstanceException: class java.util.HashMap must has getter for ...

  3. linux 命令——5 rm(转)

    昨天学习了创建文件和目录的命令mkdir ,今天学习一下linux中删除文件和目录的命令: rm命令.rm是常用的命令,该命令的功能为删除一个目录中的一个或多个文件或目录,它也可以将某个目录及其下的所 ...

  4. hdu-2680 Choose the best route---dijkstra+反向存图或者建立超级源点

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2680 题目大意: 给你一个有向图,一个起点集合,一个终点,求最短路 解题思路: 1.自己多加一个超级 ...

  5. 动态规划专题(四)——单调队列优化DP

    前言 单调队列优化\(DP\)应该还算是比较简单容易理解的吧,像它的升级版斜率优化\(DP\)就显得复杂了许多. 基本式子 单调队列优化\(DP\)的一般式子其实也非常简单: \[f_i=max_{j ...

  6. Mybatis- 配置

    主配置文件 properties 第一种 <properties> <property name="jdbc.driver" value="com.my ...

  7. 反转链表[剑指offer]之python实现

    输入一个链表,输出反转后的链表. 非递归实现: # -*- coding:utf-8 -*- # class ListNode: # def __init__(self, x): # self.val ...

  8. HP刀片服务器安装系统步骤

    原文链接 HP刀片服务器安装系统步骤: HP刀片使用一个叫OA(Onboard Administrator)的管理平台统一进行管理,具有很高的集成性,同时使用起来也很简单方便,通过IE浏览器输入IP地 ...

  9. oracle 多行数据合并一行数据

    在工作中遇见的oracle知识,多行合并成一行,记录一下 1.取出需要的数据,代码: (SELECT to_char(m.f_meetdate, 'yyyy-MM-dd'), decode(nvl(m ...

  10. vue学习之路 - 3.基本操作(中)

    基本操作(中) 本章节主要介绍:vue的条件渲染.列表渲染,计算属性和侦听器 条件渲染和列表渲染 条件渲染主要使用到了 v-if 指令,列表渲染主要使用了 v-for 指令. 下面介绍 v-if .  ...