[AH2017/HNOI2017] 影魔 - 线段树
#include<bits/stdc++.h>
#define maxn 200010
using namespace std;
int a[maxn],st[maxn][2],top,L[maxn],R[maxn],root[2][maxn];
struct node{int x,y;}A[maxn];
struct Node{int x,yl,yr;}B[maxn<<1];
long long num;
bool cmp1(node p,node q){return p.x<q.x;}
bool cmp2(Node p,Node q){return p.x<q.x;}
struct TREE{
int lc[maxn*30],rc[maxn*30],tag[maxn*30],tot;
long long sum[maxn*30];
void insert(int pre,int &k,int l,int r,int opl,int opr){
k=++tot;
tag[k]=tag[pre];
sum[k]=sum[pre]+opr-opl+1;
lc[k]=lc[pre];rc[k]=rc[pre];
if(l>=opl&&r<=opr){tag[k]++;return;}
int mid=(l+r)>>1;
if(opr<=mid) insert(lc[pre],lc[k],l,mid,opl,opr);
else if(opl>mid) insert(rc[pre],rc[k],mid+1,r,opl,opr);
else {
insert(lc[pre],lc[k],l,mid,opl,mid);
insert(rc[pre],rc[k],mid+1,r,mid+1,opr);
}
}
void query(int x,int pre,int l,int r,int opl,int opr){
if(l>=opl&&r<=opr){num+=sum[x]-sum[pre];return;}
int mid=(l+r)>>1;
if(opr<=mid) {
num+=(tag[x]-tag[pre])*(opr-opl+1);
query(lc[x],lc[pre],l,mid,opl,opr);
}
else if(opl>mid) {
num+=(tag[x]-tag[pre])*(opr-opl+1);
query(rc[x],rc[pre],mid+1,r,opl,opr);
}
else {
num+=(tag[x]-tag[pre])*(mid-opl+1);
query(lc[x],lc[pre],l,mid,opl,mid);
num+=(tag[x]-tag[pre])*(opr-mid);
query(rc[x],rc[pre],mid+1,r,mid+1,opr);
}
}
}tr[2];
int main(){
int n,m,p1,p2;
scanf("%d%d%d%d",&n,&m,&p1,&p2);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
st[top][0]=n+1;st[top][1]=0;
for(int i=1;i<=n;i++){
while(top&&a[i]>st[top][0])top--;
L[i]=st[top][1];
st[++top][0]=a[i];
st[top][1]=i;
}
st[top=0][0]=n+1;
st[top][1]=n+1;
for(int i=n;i;i--){
while(top&&a[i]>st[top][0])top--;
R[i]=st[top][1];
st[++top][0]=a[i];
st[top][1]=i;
}
int cnt=0;
for(int i=1;i<=n;i++)
if(L[i]&&R[i]<=n){
A[++cnt].x=L[i];
A[cnt].y=R[i];
}
sort(A+1,A+cnt+1,cmp1);
int now=1;
for(int i=1;i<=cnt;i++){
while(now+1<A[i].x)root[0][now+1]=root[0][now],now++;
tr[0].insert(root[0][now],root[0][A[i].x],1,n,A[i].y,A[i].y);
now=A[i].x;
}
while(now!=n)root[0][now+1]=root[0][now++];
cnt=0;
for(int i=1;i<=n;i++){
if(R[i]!=i+1 && L[i]){
B[++cnt].x=L[i];
B[cnt].yl=i+1;
B[cnt].yr=R[i]-1;
}
if(L[i]!=i-1 && R[i]<=n){
B[++cnt].x=R[i];
B[cnt].yl=L[i]+1;
B[cnt].yr=i-1;
}
}
sort(B+1,B+cnt+1,cmp2);
now=1;
for(int i=1;i<=cnt;i++){
while(now+1<B[i].x)root[1][now+1]=root[1][now],now++;
tr[1].insert(root[1][now],root[1][B[i].x],1,n,B[i].yl,B[i].yr);
now=B[i].x;
}
while(now!=n)root[1][now+1]=root[1][now++];
int l,r;
long long ans;
while(m--){
scanf("%d%d",&l,&r);
num=0;
tr[0].query(root[0][r],root[0][l-1],1,n,l,r);
ans=num*p1;num=0;
tr[1].query(root[1][r],root[1][l-1],1,n,l,r);
ans+=num*p2;
ans+=(r-l)*p1;
cout<<ans<<endl;
}
return 0;
}
[AH2017/HNOI2017] 影魔 - 线段树的更多相关文章
- 洛谷P3722 [AH2017/HNOI2017]影魔(线段树)
题意 题目链接 Sol 题解好神仙啊qwq. 一般看到这种考虑最大值的贡献的题目不难想到单调数据结构 对于本题而言,我们可以预处理出每个位置左边第一个比他大的位置\(l_i\)以及右边第一个比他大的位 ...
- P3722 [AH2017/HNOI2017]影魔(单调栈+扫描线+线段树)
题面传送门 首先我们把这两个贡献翻译成人话: 区间 \([l,r]\) 产生 \(p_1\) 的贡献当且仅当 \(a_l,a_r\) 分别为区间 \([l,r]\) 的最大值和次大值. 区间 \([l ...
- 刷题总结——影魔(HNOI2017 BZOJ4826 线段树+扫描线)
题目: Description 影魔,奈文摩尔,据说有着一个诗人的灵魂.事实上,他吞噬的诗人灵魂早已成千上万.千百年来,他收集了各式各样 的灵魂,包括诗人.牧师.帝王.乞丐.奴隶.罪人,当然,还有英雄 ...
- bzoj 4826: [Hnoi2017]影魔 [主席树 单调栈]
4826: [Hnoi2017]影魔 题意:一个排列,点对\((i,j)\),\(p=max(i+1,j-1)\),若\(p<a_i,a_j\)贡献p1,若\(p\)在\(a_1,a_2\)之间 ...
- [BZOJ4826][HNOI2017]影魔(主席树)
4826: [Hnoi2017]影魔 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 669 Solved: 384[Submit][Status][ ...
- [AH2017/HNOI2017]影魔
嘟嘟嘟 这题真的挺神的,我是真没想出来. 洛谷的第一篇题解说的非常妙,实在是佩服. 就是我们首先预处理出对于第\(i\)个数,在\(i\)左边比第一个比\(i\)大的数\(l_i\),在\(i\)右边 ...
- [AH2017/HNOI2017]影魔(主席树+单调栈)
设\(l[i]\)为i左边第一个比i大的数的下标.\(r[i]\)为i右边第一个比i大的数的下标. 我们把\(p1,p2\)分开考虑. 当产生贡献为\(p1\)时\(i\)和\(j\)一定满足,分别为 ...
- luogu P3722 [AH2017/HNOI2017]影魔
传送门 我太弱了,只会乱搞,正解是不可能正解的,这辈子不可能写正解的,太蠢了又想不出什么东西,就是乱搞这种东西,才能维持得了做题这样子 考虑将询问离线,按右端点排序,并且预处理出每个位置往前面第一个大 ...
- 洛谷P3722 影魔 [AH2017/HNOI2017] 线段树+扫描线
正解:线段树+扫描线 解题报告: 传送门! 先理解一下这道题,大概是这样儿的: 对于一个点对,如果他们的两端是这段区间的最大值和次大值,那么他们会有p1的贡献 如果他们的两端是最大值和一个非次大值,那 ...
随机推荐
- 20200116--python学习第十天
今日内容 1.参数 2.作用域 3.函数嵌套 内容回顾 线上操作系统:centos py2和py3的区别? 每种数据类型,列举你了解的方法. 3 or 9 and 8 字符串的反转 is 和 == 的 ...
- 风物长宜放眼量,人间正道是沧桑 - 一位北美 IT 技术人破局
引言 我对于本科时光的印象,还停留在那所普通 211 大学的建筑物之间,我坐在大学的时光长廊里,满眼望去,都是经历的过的故事.可毕业后回首,却很少有人能说,自己从来没有迷茫过.迷茫,仿佛就是一团乌云, ...
- 在Django中连接MySQL数据库(Python3)
我的环境: python3.6, Django2.1.5, MySQL8.0.15, win10, PyCharm, 要求:已经安装了MySQL数据库 ...
- iOS异常采用处理方式
iOS开发过程中我们经常会遇到异常问题 对异常的处理一般采用打印或者直接抛出.这样可以很方便我们调试过程有所参考,而且方便我们查看异常产生的位置信息 NSError(错误信息) 采用NSError的情 ...
- Spring Boot 配置拦截器方式
其实spring boot拦截器的配置方式和springMVC差不多,只有一些小的改变需要注意下就ok了.下面主要介绍两种常用的拦截器: 一.基于URL实现的拦截器: public class Log ...
- c++输入输出,保留几位小数
#include <iomanip> //头文件 //第一种写法 cout<<setiosflags(ios::); //第二种写法 cout.setf(ios::fixed) ...
- JS DOM属性,包括固有属性和自定义属性,以及属性获取、移除和设置
属性分为固有属性property和自定义属性attribute 固有属性查看 固有属性可以通过ele.property 来获取,自定义属性不行 <!DOCTYPE html> <ht ...
- RAID | 故障处理
RAID | 故障处理 Unconfigured(good), Spun Up 背景:磁盘替换后在导入外部配置时提示失败,磁盘状态如题. MegaCli -pdgetmissing -a0查看miss ...
- 在香蕉派的树莓派系统上配置 Syncthing 自启动
在香蕉派的树莓派系统上配置 Syncthing 自启动 —— 魏刘宏 2020 年 1 月 19 日 首先做个名词解释,” 香蕉派” 是国内一款山寨树莓派的硬件产品,” 树莓派系统” 指的是”rasp ...
- DotnetCore 单文件发布
NETCORE3.0开始,可以发布单文件,参考https://www.cnblogs.com/ZaraNet/p/11790645.html 发布后(config目录 是手工复制进去的) 运行时, ...