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

正解:主席树+单调栈。

考虑每个点为最大值时能产生的贡献。

设当前点为$p$,左边比$p$大的第一个点为$x$,右边比$p$大的第一个点为$y$,$x$和$y$可以用单调栈求出。

那么只有$(x,y)$能产生$p1$的贡献,$(x,[p+1,y-1])$和$(y,[x+1,p-1])$能产生$p2$的贡献,这可以看成很多点对。

为了方便,我们把$p1$产生贡献的点对分成$(x,y)$和$(y,x)$,$p2*2$。

于是我们找出所有这些点对,把这些点对按照横坐标排序。

然后从前往后建主席树,区间修改+标记永久化即可。

查询的时候直接查询对应区间,即$[a,b]$线段树中的$[a,b]$之和,直接除以$2$,然后再加上$(b-a)*p1$。

 //It is made by wfj_2048~
#include <algorithm>
#include <iostream>
#include <complex>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <vector>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#define inf (1<<30)
#define N (300010)
#define il inline
#define RG register
#define ll long long
#define File(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout) using namespace std; struct data{ ll c,p,l,r; }q[*N]; ll sum[*N],lazy[*N],ls[*N],rs[*N],rt[N],sz;
ll lst[N],nxt[N],st[N],k[N],n,m,p1,p2,x,cnt,top; il ll gi(){
RG ll x=,q=; RG char ch=getchar();
while ((ch<'' || ch>'') && ch!='-') ch=getchar();
if (ch=='-') q=-,ch=getchar();
while (ch>='' && ch<='') x=x*+ch-,ch=getchar();
return q*x;
} il ll cmp(const data &a,const data &b){ return a.p<b.p; } il void update(RG ll x,RG ll &y,RG ll l,RG ll r,RG ll xl,RG ll xr,RG ll v){
lazy[y=++sz]=lazy[x],ls[y]=ls[x],rs[y]=rs[x];
if (xl<=l && r<=xr){ sum[y]=sum[x]+(r-l+)*v,lazy[y]+=v; return; }
RG ll mid=(l+r)>>;
if (xr<=mid) update(ls[x],ls[y],l,mid,xl,xr,v);
else if (xl>mid) update(rs[x],rs[y],mid+,r,xl,xr,v);
else update(ls[x],ls[y],l,mid,xl,mid,v),update(rs[x],rs[y],mid+,r,mid+,xr,v);
sum[y]=sum[ls[y]]+sum[rs[y]]+(r-l+)*lazy[y]; return;
} il ll query(RG ll x,RG ll y,RG ll l,RG ll r,RG ll xl,RG ll xr,RG ll la){
if (xl<=l && r<=xr) return sum[y]-sum[x]+(r-l+)*la;
RG ll mid=(l+r)>>; la+=lazy[y]-lazy[x];
if (xr<=mid) return query(ls[x],ls[y],l,mid,xl,xr,la);
else if (xl>mid) return query(rs[x],rs[y],mid+,r,xl,xr,la);
else return query(ls[x],ls[y],l,mid,xl,mid,la)+query(rs[x],rs[y],mid+,r,mid+,xr,la);
} il void work(){
n=gi(),m=gi(),p1=gi(),p2=gi();
for (RG ll i=;i<=n;++i){
k[i]=gi();
while (top && k[st[top]]<k[i]) nxt[st[top--]]=i;
lst[i]=st[top],st[++top]=i;
}
while (top) nxt[st[top--]]=n+;
for (RG ll i=;i<=n;++i){
if (lst[i] && nxt[i]<=n){
q[++cnt]=(data){,lst[i],nxt[i],nxt[i]};
q[++cnt]=(data){,nxt[i],lst[i],lst[i]};
}
if (lst[i] && nxt[i]-i>)
q[++cnt]=(data){,lst[i],i+,nxt[i]-};
if (nxt[i]<=n && i-lst[i]>)
q[++cnt]=(data){,nxt[i],lst[i]+,i-};
}
sort(q+,q+cnt+,cmp);
for (RG ll i=;i<=cnt;++i){
while (x<q[i].p) rt[x+]=rt[x],++x;
update(rt[x],rt[x],,n,q[i].l,q[i].r,(q[i].c== ? p1 : *p2));
}
while (x<n) rt[x+]=rt[x],++x;
for (RG ll i=;i<=m;++i){
RG ll a=gi(),b=gi();
printf("%lld\n",query(rt[a-],rt[b],,n,a,b,)/+(b-a)*p1);
}
return;
} int main(){
File("sf");
work();
return ;
}

bzoj4826 [Hnoi2017]影魔的更多相关文章

  1. [bzoj4826][Hnoi2017]影魔_单调栈_主席树

    影魔 bzoj-4826 Hnoi-2017 题目大意:给定一个$n$个数的序列$a$,求满足一下情况的点对个数: 注释:$1\le n,m\le 2\cdot 10^5$,$1\le p1,p2\l ...

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

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

  3. bzoj千题计划196:bzoj4826: [Hnoi2017]影魔

    http://www.lydsy.com/JudgeOnline/problem.php?id=4826 吐槽一下bzoj这道题的排版是真丑... 我还是粘洛谷的题面吧... 提供p1的攻击力:i,j ...

  4. BZOJ4826 [Hnoi2017]影魔 【线段树 + 单调栈】

    题目链接 BZOJ4826 题解 蒟蒻智力水平捉急orz 我们会发现相邻的\(i\)和\(j\)贡献一定是\(p1\),可以很快算出来[然而我一开始忘了考虑调了半天] 我们现在只考虑不相邻的 我们只需 ...

  5. [BZOJ4826][HNOI2017]影魔 可持久化线段树

    链接 题意:给你 \(1\) 到 \(n\) 的排列 \(k_1,k_2,\dots,k_n\) ,对 \(i,j (i<j)\)来说,若不存在 \(k_s (i<s<j)\) 大于 ...

  6. [BZOJ4826] [HNOI2017] 影魔 单调栈 主席树

    题面 因为是一个排列,所以不会有重复的.如果有重复就没法做了.一开始没有仔细看题目想了半天. 发现,如果是第一种情况,那么边界\(l\)和\(r\)就应该分别是整个区间的最大值和次大值. 然后,对于那 ...

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

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

  8. bzoj 4826: [Hnoi2017]影魔 [主席树 单调栈]

    4826: [Hnoi2017]影魔 题意:一个排列,点对\((i,j)\),\(p=max(i+1,j-1)\),若\(p<a_i,a_j\)贡献p1,若\(p\)在\(a_1,a_2\)之间 ...

  9. 4826: [Hnoi2017]影魔

    4826: [Hnoi2017]影魔 https://lydsy.com/JudgeOnline/problem.php?id=4826 分析: 莫队+单调栈+st表. 考虑如何O(1)加入一个点,删 ...

随机推荐

  1. Instant App 即将到来,Android 集权或将加速分裂

    在境外,Android 的体验将越来越好,在中国,Android 的更新可能将止步于6.0! 话题讨论:Instant App 在中国将何去何从? 以下为谷歌原创文章 2017-03-03 Googl ...

  2. Effective Modern C++ Item 37:确保std::thread在销毁时是unjoinable的

    下面这段代码,如果调用func,按照C++的标准,程序会被终止(std::terminate) void func() { std::thread t([] { std::chrono::micros ...

  3. RxJava Map操作详解

    2016-06-06 RxJava是最近两年火起来的一个框架,核心是异步,但是对于我来说印象最深的是响应式编程的思想.最近刚好想把自己的项目改成用RxJava实现,所以就研究了下.抛物线和大头鬼两位大 ...

  4. apply()

    apply() 1.apply和call的区别在哪里 2.什么情况下用apply,什么情况下用call 3.apply的其他巧妙用法(一般在什么情况下可以使用apply) apply:方法能劫持另外一 ...

  5. docker工作流程

    Docker提供一种方法在容器中运行安全隔离的应用程序,应用程序与所有依赖项和库一起打包在容器中.因为你的应用程序总是可以使用它在构建镜像中期望的环境运行,测试和部署比以往任何时候都更简单,因为你的构 ...

  6. 利用python的爬虫技术爬去糗事百科的段子

    初次学习爬虫技术,在知乎上看了如何爬去糗事百科的段子,于是打算自己也做一个. 实现目标:1,爬取到糗事百科的段子 2,实现每次爬去一个段子,每按一次回车爬取到下一页 技术实现:基于python的实现, ...

  7. Docker(开课吧笔记)

    1.Docker基本概念 Docker运行在Linux,需要git技能 docker官网解析   来源于容器又不仅仅是容器,第一个版本基于LXC,远远超过容器概念   交付时拿到的是镜像,直接run运 ...

  8. mysql命令参数详解

    一,MySQL命令行参数 Usage: mysql [OPTIONS] [database] //命令方式 -?, --help //显示帮助信息并退出 -I, --help //显示帮助信息并退出  ...

  9. Android编码规范

    Android-Code-Style 1.约定 Activity.onCreate(),Fragment.onActivityCreated(),紧跟成员变量后,方法内部保持简单,尽量只调用initX ...

  10. cookie技术简介

    Cookie简介 众所周知,HTTP协议是一个无状态的协议.一个Web应用由很多个Web页面组成,每个页面都有唯一的URL来定义.用户在浏览器的地址栏输入页面的URL,浏览器就会向Web Server ...