题意:

Description

影魔,奈文摩尔,据说有着一个诗人的灵魂。事实上,他吞噬的诗人灵魂早已成千上万。千百年来,他收集了各式各样的灵魂,包括诗人、牧师、帝王、乞丐、奴隶、罪人,当然,还有英雄。每一个灵魂,都有着自己的战斗力,而影魔,靠这些战斗力提升自己的攻击。奈文摩尔有 n 个灵魂,他们在影魔宽广的体内可以排成一排,从左至右标号 1 到 n。第 i个灵魂的战斗力为k[i],灵魂们以点对的形式为影魔提供攻击力,对于灵魂对 i,j(i<j)来说,若不存在 k[s](i<s<j)大于 k[i]或者 k[j],则会为影魔提供 p1 的攻击力(可理解为:当 j=i+1 时,因为不存在满足 i<s<j 的 s,从而 k[s]不存在,这时提供 p1 的攻击力;当 j>i+1 时,若max{k[s]|i<s<j}=min{k[i],k[j]} , 则 提 供 p1 的 攻 击 力 ); 另一种情况 , 令 c 为k[i+1],k[i+2],k[i+3]......k[j-1]的最大值,若 c 满足:k[i]<c<k[j],或者 k[j]<c<k[i],则会为影魔提供 p2 的攻击力,当这样的 c 不存在时,自然不会提供这 p2 的攻击力;其他情况的点对,均不会为影魔提供攻击力。影魔的挚友噬魂鬼在一天造访影魔体内时被这些灵魂吸引住了,他想知道,对于任意一段区间a,b],1<=a<b<=n,位于这些区间中的灵魂对会为影魔提供多少攻击力,即考虑 所有满足a<=i<j<=b 的灵魂对 i,j 提供的攻击力之和。顺带一提,灵魂的战斗力组成一个 1 到 n 的排列:k[1],k[2],...,k[n]。

Input

第一行 n,m,p1,p2
第二行 n 个数:k[1],k[2],...,k[n]
接下来 m 行,每行两个数 a,b,表示询问区间[a,b]中的灵魂对会为影魔提供多少攻击力。
1 <= n,m <= 200000;1 <= p1,p2 <= 1000

Output

共输出 m 行,每行一个答案,依次对应 m 个询问。

题解:

场上推出来了但是不会写……悲伤辣么大QAQ

题目中攻击力的计算方式如下:

$max\{k[s]|i<s<j\}\leq min\{k[i],k[j]\}$则会产生$p1$的贡献;

$min\{k[i],k[j]\}<max\{k[s]|i<s<j\}<max\{k[i],k[j]\}$则会产生$p2$的贡献;

即区间端点若是整个区间的最大值和次大值则会产生$p1$的贡献,若只有其中一个是最大值则会产生$p2$的贡献,特别地,区间$[i,i+1]$也会产生$p1$的贡献;

反过来考虑$i$对哪些点对有贡献,明显当且仅当$k[i]$是整个区间$[l,r]$的最大值时才会对点对$(l-1,r+1)$产生贡献。

题目中给出了关键条件是$k$数组是1~n的一个排列,所以不会有重复的数;

那么可以用单调栈求出$i$左边第一个比它大的位置$L[i]$和右边第一个位置$R[i]$,显然$k[i]$就是区间$[L[i]+1,R[i]-1]$中的最大值;

此时点对$(L[i],R[i])$会产生$p1$的贡献,点对$(L[i],x)(i<x<R[i])$和$(x,R[i])(L[i]<x<i)$会产生$p2$的贡献;

把点对看成二维平面上的点,这就变成了二维平面上某一个矩形内求和的问题,可以离线排序后用扫描线+树状数组解决。

但是考场上我不会写这个东西。。。下午去学了一发才会。。。

听说主席树也能做,但是我不会差分。。。

代码:

(不要在意里面的奇怪东西和卡榜用优读)

 //大不列颠帝国尊贵的骑士王,圣剑Excalibur的持有者——阿尔托利亚·潘德拉贡 Arturia Pendragon
//永远是我的老婆,不接受反驳 #include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
#define inf 2147483647
#define eps 1e-9
#define lb(x) (x&-x)
using namespace std;
typedef long long ll;
struct task{
int id,z,l,r,v;
friend bool operator <(task a,task b){
return a.z<b.z;
}
}q1[],q2[];
int n,m,p1,p2,l,r,nw1=,nw2=,top=,tot1=,tot2=,num[],st[],L[],R[];
ll ans[],t1[],t2[];
char buffer[],*hd,*tl;
inline char Getchar(){
if(hd==tl){
int len=fread(buffer,,,stdin);
hd=buffer,tl=hd+len;
if(hd==tl)
return EOF;
}
return *hd++;
}
inline int rd(){
register int x=;
char c;
do c=Getchar();
while(!isdigit(c));
do{
x=(x<<)+(x<<)+(c^);
c=Getchar();
}while(isdigit(c));
return x;
}
void add(ll u,ll x){
ll uu=u;
for(;u<=n;u+=lb(u)){
t1[u]+=x;
t2[u]+=x*uu;
}
}
ll query(ll u){
ll ret=,uu=u;
for(;u;u-=lb(u)){
ret+=(uu+)*t1[u]-t2[u];
}
return ret;
}
int main(){
//scanf("%d%d%d%d",&n,&m,&p1,&p2);
n=rd(),m=rd(),p1=rd(),p2=rd();
num[]=num[n+]=inf;
st[top=]=;
for(int i=;i<=n;i++){
//scanf("%d",&num[i]);
num[i]=rd();
while(num[i]>num[st[top]])R[st[top--]]=i;
L[i]=st[top];
st[++top]=i;
}
while(top)R[st[top--]]=n+;
for(int i=;i<=m;i++){
//scanf("%d%d",&l,&r);
l=rd(),r=rd();
q1[++tot1]=(task){i,l-,l,r,-};
q1[++tot1]=(task){i,r,l,r,};
ans[i]=(ll)p1*(r-l);
}
for(int i=;i<=n;i++){
if(L[i]&&R[i]!=n+)q2[++tot2]=(task){,R[i],L[i],L[i],p1};
if(L[i]&&R[i]>i+)q2[++tot2]=(task){,L[i],i+,R[i]-,p2};
if(L[i]<i-&&R[i]!=n+)q2[++tot2]=(task){,R[i],L[i]+,i-,p2};
}
sort(q1+,q1+tot1+);
sort(q2+,q2+tot2+);
while(!q1[nw1].z)nw1++;
for(int i=;i<=n;i++){
for(;nw2<=tot2&&q2[nw2].z==i;nw2++){
add(q2[nw2].r+,-q2[nw2].v);
add(q2[nw2].l,q2[nw2].v);
}
for(;nw1<=tot1&&q1[nw1].z==i;nw1++){
ans[q1[nw1].id]+=(ll)q1[nw1].v*(query(q1[nw1].r)-query(q1[nw1].l-));
}
if(nw1>tot1)break;
}
for(int i=;i<=m;i++){
printf("%lld\n",ans[i]);
}
return ;
}

【BZOJ4826】【HNOI2017】影魔的更多相关文章

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

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

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

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

  3. bzoj4826 [Hnoi2017]影魔

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

  4. bzoj千题计划196:bzoj4826: [Hnoi2017]影魔

    http://www.lydsy.com/JudgeOnline/problem.php?id=4826 吐槽一下bzoj这道题的排版是真丑... 我还是粘洛谷的题面吧... 提供p1的攻击力:i,j ...

  5. BZOJ4826 [Hnoi2017]影魔 【线段树 + 单调栈】

    题目链接 BZOJ4826 题解 蒟蒻智力水平捉急orz 我们会发现相邻的\(i\)和\(j\)贡献一定是\(p1\),可以很快算出来[然而我一开始忘了考虑调了半天] 我们现在只考虑不相邻的 我们只需 ...

  6. [BZOJ4826][HNOI2017]影魔 可持久化线段树

    链接 题意:给你 \(1\) 到 \(n\) 的排列 \(k_1,k_2,\dots,k_n\) ,对 \(i,j (i<j)\)来说,若不存在 \(k_s (i<s<j)\) 大于 ...

  7. [BZOJ4826] [HNOI2017] 影魔 单调栈 主席树

    题面 因为是一个排列,所以不会有重复的.如果有重复就没法做了.一开始没有仔细看题目想了半天. 发现,如果是第一种情况,那么边界\(l\)和\(r\)就应该分别是整个区间的最大值和次大值. 然后,对于那 ...

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

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

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

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

  10. 4826: [Hnoi2017]影魔

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

随机推荐

  1. POJ 1995 Raising Modulo Numbers 【快速幂取模】

    题目链接:http://poj.org/problem?id=1995 解题思路:用整数快速幂算法算出每一个 Ai^Bi,然后依次相加取模即可. #include<stdio.h> lon ...

  2. 洛谷4623 [COCI2012-2013#6] BUREK

    题目描述 给定N个三角形,和M条直线,直线要么平行于X轴,要么平行于Y轴,问这M条直线 分别经过多少个三角形内部 (注意是内部即分开的两个多边形的面积均大于零). 输入输出格式 输入格式: 第一行一个 ...

  3. js 对象的创建方式和对象的区别

    js一个有三种方法创建对象,这里做一个总结. 1.对象直接量 所谓对象直接量,可以看做是一副映射表,这个方法也是最直接的一个方法,个人比较建议, 1 2 3 4 5 6 7 8 9 10 11 12 ...

  4. Maven学习总结(25)——Eclipse Maven Update 时JDK版本变更问题

    1.新建一个Maven项目JDK版本和系统版本不对应, 2.右键Maven项目->Maven->Update ProjectJDK版本改变了, 3.操作系统的JDK重装了新的版本,这是引起 ...

  5. COGS——T 1168. 机器调度

    http://www.cogs.pro/cogs/problem/problem.php?pid=1168 ★★   输入文件:machine.in   输出文件:machine.out   简单对比 ...

  6. spring boot约定优于配置的这种做法在如今越来越流行了

    约定优于配置的这种做法在如今越来越流行了,它的特点是简单.快速.便捷.但是这是建立在程序员熟悉这些约定的前提上.而 Spring 拥有一个庞大的生态体系,刚开始转到 Spring Boot 完全舍弃 ...

  7. poj2528 Mayor&#39;s posters(线段树,离散化)

    离散化的思想: 对于这样的数据 (3,10000). (9,1000000). (5.100000), (1,1000). (7,1000000) 我们能够将其处理为 (2,7). (5,9). (3 ...

  8. Educational Codeforces Round 6 C. Pearls in a Row set

    C. Pearls in a Row There are n pearls in a row. Let's enumerate them with integers from 1 to n from ...

  9. Android studio 分32位64位版本吗?

    下载的时候,是不分32位和64位的.安装完成之后,在bin目录下,有studio.exe和studio64.exe这两个文件.前一个是32位的,后一个是64位的.根据自己的电脑进行选择.

  10. 90.bower解决js的依赖管理

    转自:https://blog.csdn.net/u011537073/article/details/52951122 前言一个新的web项目开始,我们总是很自然地去下载需要用到的js类库文件,比如 ...