BZOJ:4826: [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
#include<cstdio>
#include<algorithm>
#define MN 210000
#define lp (p<<1)
#define rp ((p<<1)|1)
#define ll long long
using namespace std; int read_p,read_ca;
inline int read(){
read_p=;read_ca=getchar();
while(read_ca<''||read_ca>'') read_ca=getchar();
while(read_ca>=''&&read_ca<='') read_p=read_p*+read_ca-,read_ca=getchar();
return read_p;
}
struct tree{int si,s,t[];ll sum;tree(){s=t[]=t[]=sum=;}}t[MN<<];
struct ask{int l,r,p;}qu[MN];
bool operator < (ask a,ask b){return a.r<b.r;}
int n,m,p1,p2,a[MN],q=,st[MN],num=,top;ll MMH[MN];
inline void hb(int p,int ty,int v){
if (ty){
if (t[p].s==) return;
t[p].t[]+=v;t[p].sum+=1LL*v*t[p].s;
}else{
if (t[p].s==t[p].si) return;
t[p].t[]+=v;t[p].sum+=1LL*v*(t[p].si-t[p].s);
}
}
inline void pd(int p){
if (t[p].t[]){
hb(lp,,t[p].t[]);
hb(rp,,t[p].t[]);
t[p].t[]=;
}
if (t[p].t[]){
hb(lp,,t[p].t[]);
hb(rp,,t[p].t[]);
t[p].t[]=;
}
}
void ADD(int p,int l,int r,int pos){
t[p].s++;
if (l==r) return;
pd(p);
int mid=l+r>>;
if (pos<=mid) ADD(lp,l,mid,pos);else ADD(rp,mid+,r,pos);
}
void del(int p,int l,int r,int pos){
t[p].s--;
if (l==r) return;
pd(p);
int mid=l+r>>;
if (pos<=mid) del(lp,l,mid,pos);else del(rp,mid+,r,pos);
}
void add(int p,int l,int r,int L,int R,int ty,int v){
if (ty){
if (t[p].s==) return;
}else if (t[p].s==t[p].si) return;
if (l==L&&r==R){hb(p,ty,v);return;}
pd(p);
int mid=l+r>>;
if (R<=mid) add(lp,l,mid,L,R,ty,v);else
if (L>mid) add(rp,mid+,r,L,R,ty,v);else
add(lp,l,mid,L,mid,ty,v),add(rp,mid+,r,mid+,R,ty,v);
t[p].sum=t[lp].sum+t[rp].sum;
}
ll ask(int p,int l,int r,int L,int R){
if (l==L&&r==R) return t[p].sum;
int mid=l+r>>;
pd(p);
if (R<=mid) return ask(lp,l,mid,L,R);else
if (L>mid) return ask(rp,mid+,r,L,R);else
return ask(lp,l,mid,L,mid)+ask(rp,mid+,r,mid+,R);
}
void build(int p,int l,int r){
t[p].si=r-l+;
if (l==r) return;
int mid=l+r>>;
build(lp,l,mid);build(rp,mid+,r);
}
int main(){
register int i,j;
n=read();m=read();p1=read();p2=read();
for (i=;i<=n;i++) a[i]=read();a[]=n+;
for (i=;i<=m;i++) qu[i].l=read(),qu[i].r=read(),qu[i].p=i;
sort(qu+,qu++m);st[top=]=;
build(,,n);
for (i=;i<=m;i++){
for (;q<=qu[i].r;q++){
for (j=top;a[st[j]]<a[q];j--);
if (q!=) add(,,n,st[j]+(j==),q-,,p1);
if (st[j]>) add(,,n,,st[j]-,,p2);
if (j!=top) add(,,n,st[j]+,q-,,p2);
while (a[st[top]]<a[q]) del(,,n,st[top--]);
ADD(,,n,st[++top]=q);
}
MMH[qu[i].p]=ask(,,n,qu[i].l,qu[i].r);
}
for (i=;i<=m;i++) printf("%lld\n",MMH[i]);
}
BZOJ:4826: [Hnoi2017]影魔的更多相关文章
- 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]影魔
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=4826 题解: 主席树,单调栈 以前还没做过这种维护信息的题,感觉好奇妙. 每对相邻的两个数所 ...
- BZOJ 4826: [Hnoi2017]影魔 单调栈 主席树
https://www.lydsy.com/JudgeOnline/problem.php?id=4826 年少不知空间贵,相顾mle空流泪. 和上一道主席树求的东西差不多,求两种对 1. max(a ...
- BZOJ 4826: [Hnoi2017]影魔 单调栈+可持久化线段树
Description 影魔,奈文摩尔,据说有着一个诗人的灵魂.事实上,他吞噬的诗人灵魂早已成千上万.千百年来,他收集了各式各样 的灵魂,包括诗人.牧师.帝王.乞丐.奴隶.罪人,当然,还有英雄.每一个 ...
- BZOJ 4826 [Hnoi2017]影魔 ——扫描线 单调栈
首先用单调栈和扫描线处理出每一个数左面最近的比他大的数在$l[i]$,右面最近的比他大的数$r[i]$. 然后就可以考虑每种贡献是在什么时候产生的. 1.$(l[i],r[i])$产生$p1$的贡献 ...
- bzoj 4826: [Hnoi2017]影魔【单调栈+树状数组+扫描线】
参考:https://www.cnblogs.com/lcf-2000/p/6789680.html 这是一个相对码量少的做法,用到了区间修改区间查询的树状数组,详见:www.cnblogs.com/ ...
- 4826: [Hnoi2017]影魔
4826: [Hnoi2017]影魔 https://lydsy.com/JudgeOnline/problem.php?id=4826 分析: 莫队+单调栈+st表. 考虑如何O(1)加入一个点,删 ...
- [BZOJ4826][HNOI2017]影魔(主席树)
4826: [Hnoi2017]影魔 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 669 Solved: 384[Submit][Status][ ...
- 【LG3722】[HNOI2017]影魔
[LG3722][HNOI2017]影魔 题面 洛谷 题解 先使用单调栈求出\(i\)左边第一个比\(i\)大的位置\(lp_i\),和右边第一个比\(i\)大的位置\(rp_i\). 考虑\(i\) ...
随机推荐
- DataBase MongoDB高级知识-易使用
MongoDB高级知识-易使用 mongodb是一个面向文档的数据库,而不是关系型数据库.不采用关系模型主要是为了获取更好的扩展性.当然还有其他的一些好处. 与关系型数据库相比,面向文档的数据库不再有 ...
- Struts2学习---拦截器+struts的工作流程+struts声明式异常处理
这一节我们来看看拦截器,在讲这个之前我是准备先看struts的声明式异常处理的,但是我发现这个声明式异常处理就是由拦截器实现的,所以就将拦截器的内容放到了前面. 这一节的内容是这样的: 拦截器的介绍 ...
- awk 字符拼接
i-6gdkkemx 2 2 #cat cpu.txt | awk '{print $1,$2"核"$3"G"}' i-6gdkkemx 2核2G
- signalr中Group 分组群发消息的简单使用
前一段时间写了几篇关于signalr的文章 1.MVC中使用signalR入门教程 2.mvc中signalr实现一对一的聊天 3.Xamarin android中使用signalr实现即时通讯 在平 ...
- php-递归创建级联目录
方法一: function mk_dir($path_arr,$root){ if(!empty($path_arr)){ static $path;//每次保存上次调用的值 $path .= '/' ...
- uniq 命令详解
作用: 报告或忽略文件中的重复行,一般与sort 连用. 选项:-c count 在每列前显示该行重复出现的次数 -d repeated, 仅显示重复出现的行列 -f skip fie ...
- java 分解质因数
算法目的:对一个正整数分解质因数 一.算法分析: 1.建立整数列表,保存求到的因数. 2.声明整数i=2,用以递增取模:整数m,用于临时保存n 3.建立while循环,i小于等于整数m时,判断m%i, ...
- Windows 刷新DNS缓存
释放IP配置信息 ipconfig /release 刷新DNS ipconfig /flushdns 更新网卡适配器 ipconfig /renew
- windows 下的python 安装pycrypto
一般在官方网站下载pycrypto: https://www.dlitz.net/software/pycrypto/ 然后使用命令就可以安装成功了: python setup.py build ...
- GIT的使用中的问题处理
GIT 的常规操作 常规操作也是我自己平时常用的几个命令, 学自于 pro git 这本书中 git 配置文件 git的配置文件位置针对所有用户:/etc/gitconfig针对当前用户: -/.gi ...