序列

Time Limit: 20 Sec  Memory Limit: 512 MB
[Submit][Status][Discuss]

Description

  给定长度为n的序列:a1,a2,…,an,记为a[1:n]。
  类似地,a[l:r](1≤l≤r≤N)是指序列:al,al+1,…,ar-1,ar。
  若1≤l≤s≤t≤r≤n,则称a[s:t]是a[l:r]的子序列。
  现在有q个询问,每个询问给定两个数l和r,1≤l≤r≤n,求a[l:r]的不同子序列的最小值之和。

  例如,给定序列5,2,4,1,3,询问给定的两个数为1和3,
  那么a[1:3]有6个子序列a[1:1],a[2:2],a[3:3],a[1:2],a[2:3],a[1:3],
  这6个子序列的最小值之和为5+2+4+2+2+2=17。

Input

  输入文件的第一行包含两个整数n和q,分别代表序列长度和询问数。
  接下来一行,包含n个整数,以空格隔开,第i个整数为ai,即序列第i个元素的值。接下来q行,每行包含两个整数l和r,代表一次询问。

Output

  对于每次询问,输出一行,代表询问的答案。

Sample Input

  5 5
  5 2 4 1 3
  1 5
  1 3
  2 4
  3 5
  2 5

Sample Output

  28
  17
  11
  11
  17

HINT

  1 ≤N,Q ≤ 100000,|Ai| ≤ 10^9

Solution

  

Code

 #include<iostream>
#include<string>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
using namespace std;
typedef long long s64; const int ONE = ;
const int INF = ; int n,m;
int block[ONE],Q;
int a[ONE],pL[ONE],pR[ONE];
int stk[ONE],top;
int Log[ONE],Bin[ONE],MinD[ONE][],NumD[ONE][];
s64 Fl[ONE],Fr[ONE];
s64 ans,Ans[ONE]; struct power
{
int id;
int l,r;
}oper[ONE]; inline bool cmp(const power &a,const power &b)
{
if(block[a.l] != block[b.l]) return block[a.l] < block[b.l];
return a.r < b.r;
} inline int get()
{
int res=,Q=; char c;
while( (c=getchar())< || c>)
if(c=='-')Q=-;
if(Q) res=c-;
while((c=getchar())>= && c<=)
res=res*+c-;
return res*Q;
} inline void Pre_Rmq()
{
Log[]=-; for(int i=;i<=n;i++) Log[i] = Log[i>>] + ;
Bin[]=; for(int i=;i<=; i++) Bin[i] = Bin[i-] << ; for(int j=;j<=;j++)
for(int i=;i<=n;i++)
if(i+Bin[j]- <= n)
{
int Next = i + Bin[j-];
if(MinD[i][j-] < MinD[Next][j-])
MinD[i][j] = MinD[i][j-], NumD[i][j] = NumD[i][j-];
else
MinD[i][j] = MinD[Next][j-], NumD[i][j] = NumD[Next][j-];
}
else break;
} inline int Get(int x,int y)
{
int T = Log[y - x +];
if(MinD[x][T] < MinD[y-Bin[T]+][T]) return NumD[x][T];
return NumD[y-Bin[T]+][T];
} inline void MakepL()
{
top = ;
for(int i=n;i>=;i--)
{
while(top && a[stk[top]] > a[i])
pL[stk[top--]] = i;
stk[++top] = i;
}
while(top) pL[stk[top--]] = ;
for(int i=;i<=n;i++) pL[i]++;
} inline void MakepR()
{
top = ;
for(int i=;i<=n;i++)
{
while(top && a[stk[top]] > a[i])
pR[stk[top--]] = i;
stk[++top] = i;
}
while(top) pR[stk[top--]] = n+;
for(int i=;i<=n;i++) pR[i]--;
} inline s64 DealL(int l,int r)
{
int pos = Get(l,r);
return (s64)a[pos] * (r-pos+) + Fr[l] - Fr[pos];
} inline s64 DealR(int l,int r)
{
int pos = Get(l,r);
return (s64)a[pos] * (pos-l+) + Fl[r] - Fl[pos];
} int main()
{
n = get(); m = get(); Q = sqrt(n);
for(int i=;i<=n;i++)
{
a[i] = get(); block[i] = (i-)/Q+;
MinD[i][] = a[i]; NumD[i][] = i;
} Pre_Rmq(); MakepL(); MakepR();
for(int i=;i<=n;i++) Fl[i] = Fl[pL[i]-] + (s64)(i-pL[i]+) * a[i];
for(int i=n;i>=;i--) Fr[i] = Fr[pR[i]+] + (s64)(pR[i]-i+) * a[i]; for(int i=;i<=m;i++)
{
oper[i].id = i;
oper[i].l = get(); oper[i].r = get();
}
sort(oper+, oper+m+, cmp); int l = , r = ;
for(int i=;i<=m;i++)
{
while(r < oper[i].r) ans += DealR(l,++r);
while(oper[i].l < l) ans += DealL(--l,r);
while(r > oper[i].r) ans -= DealR(l,r--);
while(oper[i].l > l) ans -= DealL(l++,r); Ans[oper[i].id] = ans;
} for(int i=;i<=m;i++)
printf("%lld\n",Ans[i]);
}

最新文章

  1. 系统弹性概念[TODO]
  2. HTML label标签的for属性--input标签的accesskey属性
  3. ASP.NET Web Api 实现数据的分页(转载)
  4. 轻松解决MYSQL数据库连接过多的错误
  5. 《Linux内核设计与实现》读书笔记 - 目录 (完结)【转】
  6. [Guava源码分析]ImmutableCollection:不可变集合
  7. 8天学通MongoDB——第八天 驱动实践
  8. 【极客学院出品】Cocos2d-X系列课程之九-BOX2D物理引擎
  9. CF #401 (Div. 2) C.Alyona and Spreadsheet (思维)
  10. 学习Matplotlib
  11. 国内为什么没有好的 Stack Overflow 的模仿者?,因为素质太低?没有分享精神?
  12. Android自定义view进阶-- 神奇的贝塞尔曲线
  13. NB卡开卡注意事项【转】
  14. canvas 水滴图、液体进度条、仿加速球、圆球水波图
  15. 力扣(LeetCode) 771. 宝石与石头
  16. LabelRank非重叠社区发现算法介绍及代码实现(A Stabilized Label Propagation Algorithm for Community Detection in Networks)
  17. activity 概念认知
  18. mfix输出自定义数据
  19. java反射--获取成员变量信息
  20. Prism 4 文档 ---第2章:初始化Prism应用程序

热门文章

  1. HDU 5816 Hearthstone 概率dp
  2. linux上使用J-Link调试S3C2440裸机代码
  3. 生成以指定字符为开头的md5值(6位数字)
  4. Hadoop出现错误:WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable,解决方案
  5. RT-thread内核之空闲线程
  6. 【bzoj4832】[Lydsy2017年4月月赛]抵制克苏恩 概率期望dp
  7. BZOJ3997 TJOI2015组合数学(动态规划)
  8. NetScaler + Wireshark = A Perfect Combination!
  9. 【原创】宿主机远程登录虚拟机(windows server 2003系统)
  10. [Leetcode] search for a range 寻找范围