http://www.elijahqi.win/archives/3687
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
HINT

Source
预处理L[i] R[i]分别表示左边第一个比i大的数 右边第一个比i大的数

那么很容易知道一个性质

一对L[i] R[i] 可以产生p1的贡献

L[i]+1~i-1 与R[i]分别可以产生p2的贡献

L[i]与i+1~R[i]-1分别可以产生p2的贡献

也就是说当我们遇到一个R[i]的时候我们可以知道前面的L[i]的位置有一个p1的贡献增量

同理当遇到一个R[i]的时候我们i之前的L[i]+1~i-1都会增加p2的贡献 这题给出的k是个排列

进而可以发现 我们的L&R这些线段不会相交最多包含 然后就不可能出现任何重复计算答案的

那么将操作离线之后即可解决 类似二维数点

#include<cstdio>
#include<cctype>
#include<algorithm>
#define lc (x<<1)
#define rc (x<<1|1)
#define ll long long
using namespace std;
inline char gc(){static char now[1<<16],*S,*T;if(T==S){T=(S=now)+fread(now,1,1<<16,stdin);if (T==S) return EOF;}return *S++;
}
inline int read(){int x=0,f=1;char ch=gc();while(!isdigit(ch)) {if (ch=='-') f=-1;ch=gc();}while(isdigit(ch)) x=x*10+ch-'0',ch=gc();return x*f;
}
const int N=2e5+20;
struct node{int x,l,r,v,id;
}qr[N<<1];
struct node1{int x,l,r,v;
}opt[N<<2];
inline bool cmp1(const node &a,const node &b){return a.x<b.x;}
inline bool cmp2(const node1 &a,const node1 &b){return a.x<b.x;}
ll sum[N<<2],add[N<<2];
inline void pushdown(int x,int l,int r){if (!add[x]) return;int mid=l+r>>1;add[lc]+=add[x];add[rc]+=add[x];sum[lc]+=(ll)(mid-l+1)*add[x];sum[rc]+=(ll)(r-mid)*add[x];add[x]=0;
}
inline void add1(int x,int l,int r,int l1,int r1,int v){if (l1<=l&&r1>=r){add[x]+=v;sum[x]+=(ll)v*(r-l+1);return;}int mid=l+r>>1;pushdown(x,l,r);if (l1<=mid) add1(lc,l,mid,l1,r1,v);if (r1>mid) add1(rc,mid+1,r,l1,r1,v);sum[x]=sum[lc]+sum[rc];
}
inline ll query(int x,int l,int r,int l1,int r1){if (l1<=l&&r1>=r) return sum[x];int mid=l+r>>1;pushdown(x,l,r);ll tmp=0;if (l1<=mid) tmp+=query(lc,l,mid,l1,r1);if (r1>mid) tmp+=query(rc,mid+1,r,l1,r1);return tmp;
}
int n,m,p1,p2,q[N],top,L[N],R[N],a[N];ll ans[N];
int main(){freopen("bzoj4826.in","r",stdin);n=read();m=read();p1=read();p2=read();for (int i=1;i<=n;++i) a[i]=read(),R[i]=n+1;for (int i=1;i<=n;++i){while(top&&a[q[top]]<a[i]) R[q[top]]=i,--top;L[i]=q[top];q[++top]=i;}int tot=0;for (int i=1;i<=n;++i){if (L[i]&&R[i]<=n) opt[++tot]=(node1){R[i],L[i],L[i],p1};if (L[i]<i-1&&R[i]<=n) opt[++tot]=(node1){R[i],L[i]+1,i-1,p2};if (R[i]>i+1&&L[i]) opt[++tot]=(node1){L[i],i+1,R[i]-1,p2};}sort(opt+1,opt+tot+1,cmp2);for (int i=1;i<=m;++i){int l=read(),r=read();ans[i]+=(ll)(r-l)*p1;qr[i]=(node){l-1,l,r,-1,i};qr[i+m]=(node){r,l,r,1,i};}sort(qr+1,qr+2*m+1,cmp1);int now=1;for (int i=1;i<=m<<1;++i){while(now<=tot&&opt[now].x<=qr[i].x){add1(1,1,n,opt[now].l,opt[now].r,opt[now].v);++now;}int id=qr[i].id;ans[id]+=qr[i].v*query(1,1,n,qr[i].l,qr[i].r);}for (int i=1;i<=m;++i) printf("%lld\n",ans[i]);return 0;
}

bzoj 4826 [Hnoi2017]影魔相关推荐

  1. BZOJ 4826: [Hnoi2017]影魔 单调栈 主席树

    https://www.lydsy.com/JudgeOnline/problem.php?id=4826 年少不知空间贵,相顾mle空流泪. 和上一道主席树求的东西差不多,求两种对 1. max(a ...

  2. bzoj 4826: [Hnoi2017]影魔

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

  3. 4826: [Hnoi2017]影魔

    题目链接 对于每组询问,分别考虑p1p_1类型和p2p_2类型对答案的贡献 预处理preipre_i表示在灵魂ii左边第一个战斗力比它大的灵魂 类似的预处理nexinex_i 那么,所有满足贡献为p1 ...

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

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

  5. [AH2017/HNOI2017] 影魔

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

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

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

  7. [AH2017/HNOI2017]影魔

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

  8. AC日记——[Hnoi2017]影魔 bzoj 4826

    4826 思路: 主席树矩阵加减+单调栈预处理: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 200005 ...

  9. BZOJ 4826 【HNOI2017】 影魔

    题目链接:影魔 这道题就是去年序列的弱化版啊-- 我们枚举最大值的位置\(i\),找出左边第一个比\(a_i\)大的位置\(l\),右边第一个比\(a_i\)大的位置\(r\),然后我们分开考虑一下\ ...

最新文章

  1. centos5.6无法ping,无法scp的问题解析
  2. TCP,IP数据包结构
  3. 【iCore3 双核心板_ uC/OS-III】例程七:信号量——任务同步
  4. jvm 参数-server_JVM选项:-client vs -server
  5. 3结构介绍_豹驰(BOACH)声学材料吸隔声方法介绍—(下)材料隔声特性曲线
  6. python函数的嵌套和递归_Python通过递归函数输出嵌套列表元素
  7. Cassandra Leveled Compaction源码阅读
  8. Alta发布高速MIL-STD-1553 ARINC429模块-USB3.0
  9. 计算机软件专业如何选科,软件工程高中选什么科?附新高考软件工程专业选科要求...
  10. android 设置组件背景图片,Android TextView背景颜色与背景图片设置
  11. 互联网深处有趣网站——进阶篇
  12. Unity 实现蓄力攻击
  13. 机器学习数据挖掘笔记_18(PGM练习二:贝叶斯网络在遗传图谱在的应用)
  14. 双十一第二波活动来了,酷客scrm助力商家大卖
  15. C#中DataGridView移除选中行
  16. 校园招聘部分公司薪资待遇
  17. Maven学习笔记,动力节点maven教程随堂笔记(史上最全)
  18. 【硬货】vue全家桶+Echarts+百度地图,搭建数据可视化系统
  19. RGB、YUY2、YUYV、YVYU、UYVY、AYUV、YUV444、YUV422、YUV420、YUV411
  20. [转帖]软盘修复、数据恢复全攻略

热门文章

  1. 计算机上插u盘启动不了,电脑装完系统拔下u盘不能启动,插上u盘才能启动是怎么回事?...
  2. burpsuite使用——测试“电商超卖”问题
  3. CodeForce题解——Thanos Sort
  4. iOS开发教程之OC语言-欧阳坚-专题视频课程
  5. EasyExcel导入excel中时间格式到LocalDateTime字段转换器Converter
  6. normalize 函数
  7. 手把手教你做一个简单WEB系统———在线考试
  8. 如何在手机上编码python_教你如何使用Python向手机发送通知
  9. iOS 动态下载系统的中文字体
  10. vm虚拟机遇到的那些问题?