bzoj4826 [Hnoi2017]影魔
Description
Input
Output
Sample Input
7 9 5 1 3 10 6 8 2 4
1 7
1 9
1 3
5 9
1 5
Sample Output
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]影魔的更多相关文章
- [bzoj4826][Hnoi2017]影魔_单调栈_主席树
影魔 bzoj-4826 Hnoi-2017 题目大意:给定一个$n$个数的序列$a$,求满足一下情况的点对个数: 注释:$1\le n,m\le 2\cdot 10^5$,$1\le p1,p2\l ...
- [BZOJ4826][HNOI2017]影魔(主席树)
4826: [Hnoi2017]影魔 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 669 Solved: 384[Submit][Status][ ...
- bzoj千题计划196:bzoj4826: [Hnoi2017]影魔
http://www.lydsy.com/JudgeOnline/problem.php?id=4826 吐槽一下bzoj这道题的排版是真丑... 我还是粘洛谷的题面吧... 提供p1的攻击力:i,j ...
- BZOJ4826 [Hnoi2017]影魔 【线段树 + 单调栈】
题目链接 BZOJ4826 题解 蒟蒻智力水平捉急orz 我们会发现相邻的\(i\)和\(j\)贡献一定是\(p1\),可以很快算出来[然而我一开始忘了考虑调了半天] 我们现在只考虑不相邻的 我们只需 ...
- [BZOJ4826][HNOI2017]影魔 可持久化线段树
链接 题意:给你 \(1\) 到 \(n\) 的排列 \(k_1,k_2,\dots,k_n\) ,对 \(i,j (i<j)\)来说,若不存在 \(k_s (i<s<j)\) 大于 ...
- [BZOJ4826] [HNOI2017] 影魔 单调栈 主席树
题面 因为是一个排列,所以不会有重复的.如果有重复就没法做了.一开始没有仔细看题目想了半天. 发现,如果是第一种情况,那么边界\(l\)和\(r\)就应该分别是整个区间的最大值和次大值. 然后,对于那 ...
- 【BZOJ4826】[Hnoi2017]影魔 单调栈+扫描线
[BZOJ4826][Hnoi2017]影魔 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\)之间 ...
- 4826: [Hnoi2017]影魔
4826: [Hnoi2017]影魔 https://lydsy.com/JudgeOnline/problem.php?id=4826 分析: 莫队+单调栈+st表. 考虑如何O(1)加入一个点,删 ...
随机推荐
- 九度OJ题目1137:浮点数加法 (JAVA)使用BigDecimal四个案例都通过了,但是超时了。
题目描述: 求2个浮点数相加的和 题目中输入输出中出现浮点数都有如下的形式: P1P2...Pi.Q1Q2...Qj 对于整数部分,P1P2...Pi是一个非负整数 对于小数部分,Qj不等于0 输入: ...
- 如何在appconfig中配置服务的ip
开发了一个WindowsService消息服务器,刚开始一直都是在代码中把IP地址写死,所以每次只要是更换了新的IP地址后,都需要重新编译项目.所以考虑把ip配置到config文件中, 这样做的好处是 ...
- Spring Boot启动过程(五):Springboot内嵌Tomcat对象的start
标题和上一篇很像,所以特别强调一下,这个是Tomcat对象的. 从TomcatEmbeddedServletContainer的this.tomcat.start()开始,主要是利用Lifecycle ...
- 动力IT教育背后的“神秘力量”
IT行业作为当前就业形势最好的行业,成为大多数毕业生以及转行人群的首选.且国家也对互联网大力支持,IT行业市场需求空缺也越来越大,随之IT培训机构也如雨后春笋般,层出不穷. 行业易选,但该如何选择培训 ...
- cassandra高级操作之索引、排序以及分页
本次就给大家讲讲cassandra的高级操作:索引.排序和分页:处于性能的考虑,cassandra对这些支持都比较简单,所以我们不能希望cassandra完全适用于我们的逻辑,而是应该将我们的逻辑设计 ...
- NGINX下配置CACHE-CONTROL
HTTP协议的Cache -Control指定请求和响应遵循的缓存机制.在请求消息或响应消息中设置 Cache-Control并不会影响另一个消息处理过程中的缓存处理过程.请求时的缓存指令包括no-c ...
- VisualVM监控远程主机上的JAVA应用程序
使用VisualVM监控远程主机上JAVA应用程序时,需要开启远程主机上的远程监控访问,或者在远程JAVA应用程序启动时,开启远程监控选项,两种方法,选择其中一种就可以开启远程监控功能,配置完成后就可 ...
- pyhton中的Queue(队列)
什么是队列? 队列就像是水管子,先进先出,与之相对应的是栈,后进先出. 队列是线程安全的,队列自身有机制可以实现:在同一时刻只有一个线程在对队列进行操作. 存数据,取数据 import Queue q ...
- Java Applet实现五子棋游戏
从谷歌的AlphaGo到腾讯的绝艺,从人脸识别到无人驾驶,从谷歌眼镜到VR的兴起,人工智能领域在不断的向前迈进,也在不断深入的探索.但背后错综复杂的技术和利益成本也是很多企业亟待解决的难题.对于人工智 ...
- jQuery中jsonp函数实现
由于浏览器中的同源策略,不同的域名,不同的协议,甚至不同的端口都无法请求数据.因此出现了浏览器跨域请求数据问题. Jsonp是解决跨域问题的一个非常流行的方法. JSONP(JSON with Pad ...