Description

影魔,奈文摩尔,据说有着一个诗人的灵魂。事实上,他吞噬的诗人灵魂早已成千上万。千百年来,他收集了各式各样的灵魂,包括诗人、牧师、帝王、乞丐、奴隶、罪人,当然,还有英雄。每一个灵魂,都有着自己的战斗力,而影魔,靠这些战斗力提升自己的攻击。奈文摩尔有 n 个灵魂,他们在影魔宽广的体内可以排成一排,从左至右标号 1 到 n。第 i个灵魂的战斗力为 k[i],灵魂们以点对的形式为影魔提供攻击力,对于灵魂对 i,j(i < j)来说,若不存在 k[s] (i < s < j)大于 k[i]或者 k[j],则会为影魔提供 p1 的攻击力(可理解为:当 j=i+1 时,因为不存在满足 i < s < j 的 s,从而 k[s]不存在,这时提供 p1 的攻击力;当 j>i+1 时,若max{k[s]|i < s < j}<=min{k[i],k[j]} , 则 提 供 p1 的攻击力); 另 一 种 情 况 , 令 c 为k[i+1],k[i+2],k[i+3]……k[j-1]的最大值,若 c 满足:k[i] < c < k[j],或者 k[j] < c < k[i],则会为影魔提供 p2 的攻击力,当这样的 c 不存在时,自然不会提供这 p2 的攻击力;其他情况的点对,均不会为影魔提供攻击力。影魔的挚友噬魂鬼在一天造访影魔体内时被这些灵魂吸引住了,他想知道,对于任意一段区间[a,b],1<=a < b<=n,位于这些区间中的灵魂对会为影魔提供多少攻击力,即考虑 所有满足a<= i < j<=b 的灵魂对 i,j 提供的攻击力之和。顺带一提,灵魂的战斗力组成一个 1 到 n 的排列:k[1],k[2],…,k[n]。

Input

第一行 n,m,p1,p2
第二行 n 个数:k[1],k[2],…,k[n]
接下来 m 行,每行两个数 a,b,表示询问区间[a,b]中的灵魂对会为影魔提供多少攻击力。
1 <= n,m <= 200000;1 <= p1,p2 <= 1000

Output

共输出 m 行,每行一个答案,依次对应 m 个询问。

Sample Input

10 5 2 3
7 9 5 1 3 10 6 8 2 4
1 7
1 9
1 3
5 9
1 5

Sample Output

30
39
4
13
16

Solution

和HNOI2016序列很像,都可以转换成平面上的问题。不过这题的区别在于序列中一个数在平面上的贡献区域变成了一个直角而不是矩形。

同样,记AiA_i左边第一个比他大的数的位置为lastilast_i,右边第一个比他大的数位置为nexti为next_i,所以AiA_i有p1p1贡献的区间仅有[lasti,nexti][last_i,next_i]一个,所以平面上的点(lasti,nexti)(last_i,next_i)点的值为p1p1;AiA_i有p2p2贡献的区间有两种,第一种是左端点在lastilast_i,右端点范围为[i+1,nexti−1][i+1,next_i-1],第二种是右端点在nextinext_i,左端点范围为[lasti,i−1][last_i,i-1],这两种是分别平行于y轴和x轴的线段。所以序列中一个点的贡献在平面上大概长这样:

p1 p2 p2 p2 p2 ...
p2
p2
p2
...

所以我们需要横竖各扫一遍,而且注意直角的顶点处的贡献是p1p1,边上的是p2p2。每个询问区间还要记得加上R−LR-L个p1p1,这是第一种贡献的特殊情况j=i+1j=i+1。

代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;template<typename T>inline void read(T &x){T f=1;char ch=getchar();for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;for(x=0;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0';x*=f;
}typedef long long LL;
const int maxn=200010;
struct Q1{int l,r,y,f,id;bool operator<(Q1 b){if(y==b.y)return f<b.f;return y<b.y;}
}q1[maxn<<1];
struct Q2{int u,d,x,f,id;bool operator<(Q2 b){if(x==b.x)return f<b.f;return x>b.x;}
}q2[maxn<<1];
int n,m,a[maxn],cnt,L[maxn],R[maxn];
int sta[maxn],top;
LL p1,p2,delta,ans[maxn];
struct Bit{LL a[maxn],b[maxn];void Add(int x,LL val){if(!x)return;for(int i=x;i<=n;i+=(i&-i))a[i]+=val,b[i]+=val*x;}void Add(int l,int r,LL val){Add(l,val);Add(r+1,-val);}LL Query(int x){LL ans=0;for(int i=x;i;i-=(i&-i))ans+=(x+1)*a[i]-b[i];return ans;}LL Query(int l,int r){return Query(r)-Query(l-1);}void clear(){memset(a,0,sizeof a);memset(b,0,sizeof b);}
}tree,tag;int main(){read(n);read(m);read(p1);read(p2);for(int i=1;i<=n;i++)read(a[i]);for(int i=1;i<=n;i++){while(top&&a[sta[top]]<a[i])top--;top++;L[sta[top]=i]=sta[top-1];}sta[top=0]=n+1;for(int i=n;i>=1;i--){while(top&&a[sta[top]]<a[i])top--;top++;R[sta[top]=i]=sta[top-1];}for(int i=1,x,y;i<=m;i++){read(x);read(y);ans[i]+=p1*(y-x);q1[i].l=q1[i].r=x;q1[i].y=y;q1[i].id=i;q1[i].f=1;q2[i].u=q2[i].d=y;q2[i].x=x;q2[i].id=i;q2[i].f=1;}cnt=m;delta=p1-2*p2;for(int i=2;i<n;i++){cnt++;q1[cnt].l=L[i];q1[cnt].r=i-1;q1[cnt].y=R[i];q1[cnt].f=0;q1[cnt].id=i;q2[cnt].u=R[i];q2[cnt].d=i+1;q2[cnt].x=L[i];q2[cnt].f=0;q2[cnt].id=i;}sort(q1+1,q1+cnt+1);sort(q2+1,q2+cnt+1);for(int i=1;i<=cnt;i++){if(!q1[i].f){tree.Add(max(q1[i].l,1),min(q1[i].r,n),p2);if(q1[i].l)tag.Add(q1[i].l,q1[i].l,1);}else ans[q1[i].id]+=tree.Query(max(q1[i].l,1),n)+tag.Query(max(q1[i].l,1),n)*delta;}tree.clear();for(int i=1;i<=cnt;i++){if(!q2[i].f)tree.Add(max(q2[i].d,1),min(q2[i].u,n),p2);else ans[q2[i].id]+=tree.Query(1,min(q2[i].u,n));}for(int i=1;i<=m;i++)printf("%lld\n",ans[i]);return 0;
}

[题解]bzoj4826 HNOI2017 影魔相关推荐

  1. [BZOJ4826][HNOI2017]影魔(主席树)

    4826: [Hnoi2017]影魔 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 669  Solved: 384 [Submit][Status ...

  2. Bzoj4826 [Hnoi2017]影魔

    Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 425  Solved: 244 Description 影魔,奈文摩尔,据说有着一个诗人的灵魂.事实 ...

  3. bzoj4826 hnoi2017影魔

    Description 影魔,奈文摩尔,据说有着一个诗人的灵魂.事实上,他吞噬的诗人灵魂早已成千上万.千百年来,他收集了各式各样的灵魂,包括诗人.牧师.帝王.乞丐.奴隶.罪人,当然,还有英雄. 每一个 ...

  4. bzoj4826[hnoi2017]影魔

    题意:每次询问一个区间[l,r],问[l,r]中的每一对(i,j)能够贡献多少总加成?给定序列a是1~n的一个排列,也就是a[i]两两不同. 设z=max{a[i+1],a[i+2],...,a[j- ...

  5. BZOJ4826: [Hnoi2017]影魔

    Description 影魔,奈文摩尔,据说有着一个诗人的灵魂.事实上,他吞噬的诗人灵魂早已成千上万.千百年来,他收集了各式各样 的灵魂,包括诗人.牧师.帝王.乞丐.奴隶.罪人,当然,还有英雄.每一个 ...

  6. [AH2017/HNOI2017]影魔

    P3722 [AH2017/HNOI2017]影魔 题解: 法一: [bzoj4826][HNOI2017]影魔 直接转化成区间内单点的贡献, 分开p1,p2考虑 而min(ai,aj),max(ai ...

  7. 【BZOJ4826】[Hnoi2017]影魔 单调栈+扫描线

    [BZOJ4826][Hnoi2017]影魔 Description 影魔,奈文摩尔,据说有着一个诗人的灵魂.事实上,他吞噬的诗人灵魂早已成千上万.千百年来,他收集了各式各样的灵魂,包括诗人.牧师.帝 ...

  8. [AH2017/HNOI2017] 影魔

    [AH2017/HNOI2017]影魔 30pts 暴力在每个区间中枚举点对(a,b)(a,b)(a,b)并查询点对之间的最大值maxmaxmax,若max<=min(a,b)max<=m ...

  9. bzoj 4826 [Hnoi2017]影魔

    http://www.elijahqi.win/archives/3687 Description 影魔,奈文摩尔,据说有着一个诗人的灵魂.事实上,他吞噬的诗人灵魂早已成千上万.千百年来,他收集了各式 ...

最新文章

  1. 数字图像处理——添加高斯噪声椒盐噪声
  2. wireshark分析SIP协议——注册
  3. ADODB.Stream 错误 '800a0bbc' 写入文件失败
  4. Android 系统性能优化(55)---Android 性能优化之内存优化
  5. pyqt5快速开发与实战_用云开发快速制作客户业务需求收集小程序丨实战
  6. java collection_【基础篇】java-Collection集合-List和Set
  7. 507 LOJ 「LibreOJ NOI Round #1」接竹竿
  8. echarts制作航线轨迹原来是这样的
  9. matlab二重定积分_怎么用matlab计算这个二重积分如何用matlab求二重积分
  10. 油猴插件安装以及好用的脚本推荐
  11. 交换机短路_交换机环路发现及处理
  12. 网络应用程序的通信视角
  13. 【C++】0314算法阿里笔试题
  14. C语言求字符串数组的长度函数计算
  15. Linux文件系统的设计
  16. CMakeList笔记
  17. 对速度饱和效应的一些理解
  18. 来讲一讲php的单例模式及应用场景
  19. php 多线程环境,基于PHP7.2.19打造多线程开发环境
  20. iOS面向切面编程-AOP

热门文章

  1. 使用nginx部署django
  2. 入学年份(year)
  3. P5.js之数组使用——绘制水墨画笔,实现跟随鼠标移动的效果
  4. 第二十四次CSP考试第二题,速度拿70分。
  5. 服务器进不了浏览器不支持,省考报名系统打开显示服务器进不去,该如何解决?...
  6. 更好的包管理器——pnpm
  7. linux从光盘制作.iso,Linux(ubuntu)使用dd从iso制作win7安装光盘(读卡器一样)
  8. WinRAR x64 v5.5中文版去广告过程
  9. Java并发指南14:Java并发容器ConcurrentSkipListMap与CopyOnWriteArrayList
  10. 什么是智能双线机房和BGP智能双线机房的原理