影魔
  • 这么简单的方法尽然想不到,我是真的菜
  • 对每个点,用单调栈的方式处理出他左右第一个比他大的数的位置,你可以把\(0\)和\(n+1\)设成\(inf\)。
  • 显然对于每对\(lef[i]\)和\(rig[i]\)都会做出\(p1\)的贡献
  • 每个\(lef[i]\)会对\(i+1\)到\(rig[i]-1\)做出\(p2\)贡献
  • 同理,每个\(rig[i]\)都会给\(lef[i]+1\)到\(i-1\)做出\(p2\)贡献
  • 用结构体存下来,按顺序用线段树将贡献加入即可
  • 统计贡献,对于每个询问\(l-r\)在扫到\(l-1\)时将这段区间减去,在扫到\(r\)时再将这段区间贡献加上即可
// luogu-judger-enable-o2
#include<bits/stdc++.h>
using namespace std;
typedef int sign;
typedef long long ll;
#define For(i,a,b) for(register sign i=(sign)a;i<=(sign)b;++i)
#define Fordown(i,a,b) for(register sign i=(sign)a;i>=(sign)b;--i)
const int N=2e5+5;
bool cmax(sign &a,sign b){return (a<b)?a=b,1:0;}
bool cmin(sign &a,sign b){return (a>b)?a=b,1:0;}
template<typename T>inline T read()
{
T f=1,ans=0;
char ch=getchar();
while(!isdigit(ch)&&ch!='-')ch=getchar();
if(ch=='-')f=-1,ch=getchar();
while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch-'0'),ch=getchar();
return ans*f;
}
template<typename T>inline void write(T x,char y)
{
if(x==0)
{
putchar('0');putchar(y);
return;
}
if(x<0)
{
putchar('-');
x=-x;
}
static char wr[20];
int top=0;
for(;x;x/=10)wr[++top]=x%10+'0';
while(top)putchar(wr[top--]);
putchar(y);
}
void file()
{
#ifndef ONLINE_JUDGE
freopen("3722.in","r",stdin);
freopen("3722.out","w",stdout);
#endif
}
int n,m,p1,p2;
int a[N];
struct Q
{
int l,r,x,tag,id;
bool operator < (const Q &s)const {return x<s.x;}
}opt[N<<2];
int cnt;
ll ans[N];
void input()
{
int l,r;
n=read<int>();m=read<int>();p1=read<int>();p2=read<int>();
For(i,1,n)a[i]=read<int>();
For(i,1,m)
{
l=read<int>();r=read<int>();
ans[i]+=1ll*(r-l)*1ll*p1;
opt[++cnt]=(Q){l,r,l-1,-1,i};
opt[++cnt]=(Q){l,r,r,1,i};
}
}
const int inf=0x3f3f3f3f;
namespace Tree
{
#define mid ((l+r)>>1)
#define lson h<<1,l,mid
#define rson h<<1|1,mid+1,r
ll sum[N<<2],lazy[N<<2];
void push_up(int h)
{
sum[h]=sum[h<<1]+sum[h<<1|1];
}
void push_down(int h,int l,int r)
{
if(!lazy[h])return;
int ls=h<<1,rs=ls|1;
lazy[ls]+=lazy[h];lazy[rs]+=lazy[h];
sum[ls]+=lazy[h]*1ll*(mid-l+1);
sum[rs]+=lazy[h]*1ll*(r-mid);
lazy[h]=0;
}
void update(int h,int l,int r,int s,int t,ll v)
{
if(s<=l&&r<=t)
{
lazy[h]+=v;
sum[h]+=1ll*v*1ll*(r-l+1);
}
else
{
push_down(h,l,r);
if(s<=mid)update(lson,s,t,v);
if(mid<t)update(rson,s,t,v);
push_up(h);
}
}
ll query(int h,int l,int r,int s,int t)
{
if(s<=l&&r<=t)return sum[h];
push_down(h,l,r);
ll res=0;
if(s<=mid)res=query(lson,s,t);
if(mid<t)res+=query(rson,s,t);
push_up(h);
return res;
}
}
#define rg register
int lef[N],rig[N];
struct node
{
int l,r,x;
ll v;
bool operator < (const node &s)const {return x<s.x;}
}e[N<<2];
int sz;
void init()
{
int j;
sort(opt+1,opt+cnt+1);
a[0]=a[n+1]=inf;
For(i,1,n)
{
for(j=i-1;j>=0;j=lef[j])if(a[j]>a[i])break;
lef[i]=j;
}
Fordown(i,n,1)
{
for(j=i+1;j<=n+1;j=rig[j])if(a[j]>a[i])break;
rig[i]=j;
}
//For(i,1,n)cout<<lef[i]<<' '<<rig[i]<<endl;
For(i,1,n)
{
if(lef[i]+1<i&&rig[i]<=n)e[++sz]=(node){lef[i]+1,i-1,rig[i],p2};
if(1<=lef[i]&&rig[i]>i+1)e[++sz]=(node){i+1,rig[i]-1,lef[i],p2};
if(1<=lef[i]&&rig[i]<=n)e[++sz]=(node){lef[i],lef[i],rig[i],p1};
}
sort(e+1,e+sz+1);
}
void work()
{
int pos1=1,pos2=1;
while(pos2<=cnt&&!opt[pos2].x)pos2++;
//cerr<<pos2<<' '<<cnt<<endl;
For(i,1,n)
{
for(;pos1<=sz&&e[pos1].x==i;++pos1)
Tree::update(1,0,n,e[pos1].l,e[pos1].r,e[pos1].v);
for(;pos2<=cnt&&opt[pos2].x==i;++pos2)
ans[opt[pos2].id]+=Tree::query(1,0,n,opt[pos2].l,opt[pos2].r)*opt[pos2].tag;
}
For(i,1,m)write(ans[i],'\n');
}
int main()
{
file();
input();
init();
work();
return 0;
}

HNOI2017影魔的更多相关文章

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

    4826: [Hnoi2017]影魔 题意:一个排列,点对\((i,j)\),\(p=max(i+1,j-1)\),若\(p<a_i,a_j\)贡献p1,若\(p\)在\(a_1,a_2\)之间 ...

  2. 4826: [Hnoi2017]影魔

    4826: [Hnoi2017]影魔 https://lydsy.com/JudgeOnline/problem.php?id=4826 分析: 莫队+单调栈+st表. 考虑如何O(1)加入一个点,删 ...

  3. 【LG3722】[HNOI2017]影魔

    [LG3722][HNOI2017]影魔 题面 洛谷 题解 先使用单调栈求出\(i\)左边第一个比\(i\)大的位置\(lp_i\),和右边第一个比\(i\)大的位置\(rp_i\). 考虑\(i\) ...

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

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

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

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

  6. [bzoj4826][Hnoi2017]影魔_单调栈_主席树

    影魔 bzoj-4826 Hnoi-2017 题目大意:给定一个$n$个数的序列$a$,求满足一下情况的点对个数: 注释:$1\le n,m\le 2\cdot 10^5$,$1\le p1,p2\l ...

  7. bzoj4826 [Hnoi2017]影魔

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

  8. BZOJ:4826: [Hnoi2017]影魔

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

  9. [AH/HNOI2017]影魔

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

随机推荐

  1. 复习整理9:SpringMVC应用以及源码解析

    一:SpringMVC是什么 SpringMVC只是Spring的一个子框架,作用学过Struts2的应该很好理解,他们都是MVC的框架.学他就是用来代替Struts2的,那么为什么不用Struts2 ...

  2. 面试3——java集合类总结(List)

    1.集合类 数组:可以存储对象,也可以存储基本数据类型,但是一次只能存储一种类型,且长度一定,不可改变. 集合:只能存储对象,长度可变,可以存储不同类型的对象.Java集合类主要有三种:set,lis ...

  3. Intel x86_64 Architecture Background 1

    首先讲一下什么是Intel x86,x86是指intel的开发的一种32位指令集,从386开始时代开始的一直沿用至今,是一种cisc指令集.x84_64是x86 CPU开始迈向64位的时候,有2选择: ...

  4. 利用卷积神经网络(VGG19)实现火灾分类(附tensorflow代码及训练集)

    源码地址 https://github.com/stephen-v/tensorflow_vgg_classify 1. VGG介绍 1.1. VGG模型结构 1.2. VGG19架构 2. 用Ten ...

  5. 【nodejs】让nodejs像后端mvc框架(asp.net mvc)一样处理请求--控制器和处理函数的注册篇(4/8)【controller+action】

    文章目录 前情概要 前边的文章把一些基本的前置任务都完成了.接下就是比较重要的处理函数action是如何自动发现和注册的拉,也就是入口函数RouteHandler(也是我们的第一个express中间件 ...

  6. Linux下对文件进行加密备份的操作记录

    由于公司之前在阿里云上购买了一些机器,后续IDC建设好后,又将线上业务从阿里云上迁移到IDC机器上了,为了不浪费阿里云上的这几台机器资源,打算将这些机器做成IP SAN共享存储,然后作为IDC数据的一 ...

  7. Redis常用操作-------Hash(哈希表)

    1.HDEL key field [field ...] 删除哈希表 key 中的一个或多个指定域,不存在的域将被忽略. 在Redis2.4以下的版本里, HDEL 每次只能删除单个域,如果你需要在一 ...

  8. B. Math

    链接 [http://codeforces.com/contest/1062/problem/B] 题意 给你n,有两种操作要么乘以某个数,要么开根但必须开根后是整数才能开,问你最后能变成最小的数是多 ...

  9. 作业20171019 alpha-1成绩

    申诉 对成绩有疑问或不同意见的同学,请在群里[@杨贵福]. 申诉时间截止2017年11月21日 12:00. 总结 普遍成绩有明显上升,归功于1. 团队全都超额完成1次站立会议,多数团队完超额2次; ...

  10. Scrum Meeting NO.7

    Scrum Meeting No.7 1.会议内容 经过老师提醒,我们认识到,应尽快把主要功能实现,其他的细枝末节应在这之后慢慢添加.当今最重要的任务是和online组和数据处理组实现数据共享. 此外 ...