BZOJ 4826 影魔
本题可以采用主席树的在线做法,只不过常数会 \(super\) 大。
和其他题解差不多,我们先要求出第 \(i\) 个数的 \(l_i\) 和 \(r_i\) ,其中 \(l_i\) 表示左边第一个比它大的点(若没有则为 \(0\) ), \(r_i\) 表示右边比它大的第一个点,若没有则为 \(n+1\) 。
那么对于 \(i\)
点对 \((l_i,r_i)\) 可以有 \(p_1\) 的贡献
点对 \(([l_i+1,i-1],r_i),(l_i,[i+1,r_i-1])\) 可以有 \(p_2\) 的贡献 \((l_i+1<i-1),(i+1<r_i-1)\)
\((i,i+1)\) 也可以有 \(p_1\) 的贡献
有了这么几点,我们就可以拿主席树来维护,对于每个点对,我们以 \(x\) 更新,若 \(x\) 为区间,则以 \(y\) 更新。
用一个单调栈预处理,链表(或 \(vector\) 存储更新信息)。
\(AC \kern 0.4emCODE\):
#include<bits/stdc++.h>
#define ri register int
#define p(i) ++i
#define LL long long
using namespace std;
const int N=2e5+7;
inline int read() {
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*f;
}
struct node{
int l,r,w;
node(){}
node(int l,int r,int w):l(l),r(r),w(w){}
};
struct E{
int first[N],t;
void init() {t=1;}
struct edge{
int nxt;
node v;
}e[N<<2];
inline void add(int u,node v) {
e[t].v=v;
e[t].nxt=first[u];
first[u]=t++;
}
}E;
struct Seg{
int root[N],tot;
struct Segmenttree{
int l,r;
LL sum,tag;
}T[N*32];
inline void update(int &x,int l,int r,int lt,int rt,int w) {
if (!x) x=p(tot);
T[x].sum+=1ll*(min(r,rt)-max(l,lt)+1)*w;
if (l<=lt&&rt<=r) {T[x].tag+=1ll*w;return;}
int mid=(lt+rt)>>1;
if (l<=mid) update(T[x].l,l,r,lt,mid,w);
if (r>mid) update(T[x].r,l,r,mid+1,rt,w);
}
inline int merge(int x,int y) {
if (!x||!y) return x+y;
T[x].sum+=T[y].sum;T[x].tag+=T[y].tag;
T[x].l=merge(T[x].l,T[y].l);
T[x].r=merge(T[x].r,T[y].r);
return x;
}
inline LL query(int x,int l,int r,int lt,int rt) {
if (!x) return 0;
if (l<=lt&&rt<=r) return T[x].sum;
int mid=(lt+rt)>>1;LL res=0;
if (l<=mid) res+=query(T[x].l,l,r,lt,mid);
if (r>mid) res+=query(T[x].r,l,r,mid+1,rt);
return res+1ll*(min(r,rt)-max(l,lt)+1)*T[x].tag;
}
}T;
int n,st[N],p,pp,at[N],ll[N],rr[N],m;
int main() {
n=read(),m=read(),p=read(),pp=read();
const int p1=p,p2=pp;
int tp=0;
for (ri i(1);i<=n;p(i)) {
at[i]=read();
while(tp&&at[st[tp]]<at[i]) rr[st[tp--]]=i;
ll[i]=st[tp];
st[p(tp)]=i;
}
while(tp) rr[st[tp--]]=n+1;
E.init();
for (ri i(1);i<=n;p(i)) {
if (i!=n) E.add(i,node(i+1,i+1,p1));
if (ll[i]&&rr[i]<=n) E.add(ll[i],node(rr[i],rr[i],p1));
if (ll[i]&&i+1<=rr[i]-1) E.add(ll[i],node(i+1,rr[i]-1,p2));
if (rr[i]<=n&&ll[i]+1<=i-1) E.add(rr[i],node(ll[i]+1,i-1,p2));
}
for (ri i(1);i<=n;p(i)) {
for (ri j(E.first[i]);j;j=E.e[j].nxt) {
node v=E.e[j].v;
int l=v.l,r=v.r,w=v.w;
T.update(T.root[i],l,r,1,n,w);
}
T.root[i]=T.merge(T.root[i],T.root[i-1]);
}
for (ri i(1);i<=m;p(i)) {
int l=read(),r=read();
printf("%lld\n",T.query(T.root[r],l,r,1,n)-T.query(T.root[l-1],l,r,1,n));
}
return 0;
}
BZOJ 4826 影魔的更多相关文章
- bzoj 4826: [Hnoi2017]影魔 [主席树 单调栈]
4826: [Hnoi2017]影魔 题意:一个排列,点对\((i,j)\),\(p=max(i+1,j-1)\),若\(p<a_i,a_j\)贡献p1,若\(p\)在\(a_1,a_2\)之间 ...
- BZOJ:4826: [Hnoi2017]影魔
Description 影魔,奈文摩尔,据说有着一个诗人的灵魂.事实上,他吞噬的诗人灵魂早已成千上万.千百年来,他收集了各式各样的灵魂,包括诗人.牧师.帝王.乞丐.奴隶.罪人,当然,还有英雄.每一个灵 ...
- ●BZOJ 4826 [Hnoi2017]影魔
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=4826 题解: 主席树,单调栈 以前还没做过这种维护信息的题,感觉好奇妙. 每对相邻的两个数所 ...
- BZOJ.4826.[AHOI/HNOI2017]影魔(树状数组/莫队 单调栈)
BZOJ LOJ 洛谷 之前看\(mjt\)用莫队写了,以为是一种正解,码了3h结果在LOJ T了没A= = 心态爆炸(upd:发现是用C++11(NOI)交的,用C++11交就快一倍了...) 深刻 ...
- BZOJ 4826 【HNOI2017】 影魔
题目链接:影魔 这道题就是去年序列的弱化版啊…… 我们枚举最大值的位置\(i\),找出左边第一个比\(a_i\)大的位置\(l\),右边第一个比\(a_i\)大的位置\(r\),然后我们分开考虑一下\ ...
- BZOJ 4826: [Hnoi2017]影魔 单调栈 主席树
https://www.lydsy.com/JudgeOnline/problem.php?id=4826 年少不知空间贵,相顾mle空流泪. 和上一道主席树求的东西差不多,求两种对 1. max(a ...
- AC日记——[Hnoi2017]影魔 bzoj 4826
4826 思路: 主席树矩阵加减+单调栈预处理: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 200005 ...
- BZOJ 4826: [Hnoi2017]影魔 单调栈+可持久化线段树
Description 影魔,奈文摩尔,据说有着一个诗人的灵魂.事实上,他吞噬的诗人灵魂早已成千上万.千百年来,他收集了各式各样 的灵魂,包括诗人.牧师.帝王.乞丐.奴隶.罪人,当然,还有英雄.每一个 ...
- BZOJ 4826 [Hnoi2017]影魔 ——扫描线 单调栈
首先用单调栈和扫描线处理出每一个数左面最近的比他大的数在$l[i]$,右面最近的比他大的数$r[i]$. 然后就可以考虑每种贡献是在什么时候产生的. 1.$(l[i],r[i])$产生$p1$的贡献 ...
随机推荐
- 重置networker9.0密码
一.重置Networker 9.0密码 下面所有步骤在Networker服务器上操作 1.创建"mypassword_in.txt"文件 在服务器C盘根目录下创建一个 " ...
- Spring MVC中的M V C
M→Model 模型 V→View 视图 C→Controller 控制器 也就是说一次交互由生到死(请求到相应) 需要经过 这三个层级 来完成 那么为什么这么设计 这么设计又有什么好处 我是这么认为 ...
- 常见数据库SELECT结果只显示前几条记录方法汇总
常见数据库SELECT结果只显示前几条记录方法汇总 为了查看数据表中的数据情况.经常会遇到想让查询结果只显示N行,比如只显示10行的情况.不同的数据库有不同的关键字和SELECT实现语法. 1.SQL ...
- prignMVC+myBatis整合—— 基于MapperFactoryBean
学习本节内容请先看"MyBatis的基本应用".地址:http://lydia-fly.iteye.com/admin/blogs/2152948 Spring与MyBatis整合 ...
- 【LeetCode】933.最近的请求次数
933.最近的请求次数 知识点:队列: 题目描述 写一个 RecentCounter 类来计算特定时间范围内最近的请求. 请你实现 RecentCounter 类: RecentCounter() 初 ...
- springboot-1-入门
springboot-1-入门 1.springboot简介,背景 简化Spring应用开发的一个框架: 整个Spring技术栈的一个大整合: J2EE开发的一站式解决方案: 2.极简hellowor ...
- Django的ORM如何执行group by 语句
问题描述: 使用Django的ORM建立了如下Model: class Book(models.Model): name = models.CharField(max_length=300) page ...
- 犀牛Rhino 7.0中文版安装破解教程
犀牛Rhino 7.0中文版是一款专业的.功能强大的三维建模软件,利用它可以创建.编辑.分析.提供.渲染.动画与转换NURBS线条.曲面.实体与多边形网格:它能轻易整合3DS MAX 与Softima ...
- Java文件I/O简单介绍
目录 一.File类 1.1 构造方法 1.2 常用方法 1.3 例子 二.基础I/O:字节流.字符流 2.1 字节流 2.1.1 字节输出流 OutputStream 2.1.2 FileOutpu ...
- post传参params与body的区别(@RequestParam和@RequestBody的区别)
1.axios post请求 Content-Type默认为 application/x-www-form-urlencoded,我们传递参数的时,params里面的参数(简单的对象,通过 &quo ...