Description:
提供p1p1p1的攻击力:i,ji,ji,j位置的数是区间[i,j][i,j][i,j]的最大值和次大值
提供p2p2p2的攻击力:i,ji,ji,j位置的数有一个是区间[i,j][i,j][i,j]的最大值,另一个不是次大值


Solution:
考虑枚举aiaia_i,并用单调栈求出左右第一个比aiaia_i大的位置li,rili,ril_i,r_i。
p1p1p1有贡献的区间是左端点为lilil_i,右端点为ririr_i
p2p2p2有贡献的区间是左端点为lilil_i,右端点为(i,ri)(i,ri)(i,r_i),右端点为ririr_i,左端点为(li,i)(li,i)(l_i,i)
这样我们就可以扫描线+树状数组了。


#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
const int N = 4e5 + 5;
int n, m, p1, p2, tot, top = 1;
ll t1[N], t2[N] , ans[N];
int a[N], st[N], l[N], r[N];
struct seg {int l, r, p, id, v;seg() {}seg(int _l, int _r, int _p, int _id, int _v) : l(_l), r(_r), p(_p), id(_id), v(_v) {}bool friend operator < (const seg &a, const seg &b) {return a.p < b.p;}
} s[N], q[N];
void update(int x, int d) {for(int i = x; i <= n; i += i & -i) {t1[i] += d;t2[i] += x * d;}
}
ll query(int x) {ll ret = 0;for(int i = x; i; i -= i & -i) {ret += (ll)(x + 1) * t1[i] - t2[i];}return ret;
}
int main() {scanf("%d%d%d%d", &n, &m, &p1, &p2);a[0] = a[n + 1] = n + 1;for(int i = 1; i <= n; ++i) {scanf("%d", &a[i]);while(top && a[i] > a[st[top]]) {r[st[top]] = i;--top;}l[i] = st[top];st[++top] = i;}for(int i = 1; i <= m; ++i) {int l, r;scanf("%d%d", &l, &r);ans[i] += (r - l) * p1;q[i] = seg(l, r, l - 1, i, -1);q[i + m] = seg(l, r, r, i, 1);}sort(q + 1, q + 2 * m + 1);while(top) {r[st[top--]] = n + 1;}for(int i = 1; i <= n; ++i) {if(l[i] && r[i] <= n) {s[++tot] = seg(l[i], l[i], r[i], 0, p1);}if(r[i] <= n && l[i] + 1 <= i - 1) {s[++tot] = seg(l[i] + 1, i - 1, r[i], 0, p2);}if(l[i] && i + 1 <= r[i] - 1) {s[++tot] = seg(i + 1, r[i] - 1, l[i], 0, p2);}}sort(s + 1, s + tot + 1);for(int i = 1, p = 1, j = 1; i <= n; ++i) {while(j <= tot && s[j].p == i) {update(s[j].l, s[j].v);update(s[j].r + 1, -s[j].v);++j;}while(p <= 2 * m && !q[p].p) {++p;}while(p <= 2 * m && q[p].p == i) {ans[q[p].id] += q[p].v * (query(q[p].r) - query(q[p].l - 1)); ++p;}}for(int i = 1; i <= m; ++i) {printf("%lld\n", ans[i]);}return 0;
}


[HNOI 2017] bzoj4826 影魔 [单调栈+扫描线]相关推荐

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

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

  2. 【HNOI 2017】影魔

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

  3. BZOJ 4826: [Hnoi2017]影魔 单调栈 主席树

    https://www.lydsy.com/JudgeOnline/problem.php?id=4826 年少不知空间贵,相顾mle空流泪. 和上一道主席树求的东西差不多,求两种对 1. max(a ...

  4. 【BZOJ4826】【HNOI2017】影魔(扫描线,单调栈)

    [BZOJ4826][HNOI2017]影魔(扫描线,单调栈) 题面 BZOJ 洛谷 Description 影魔,奈文摩尔,据说有着一个诗人的灵魂.事实上,他吞噬的诗人灵魂早已成千上万.千百年来,他 ...

  5. 单调栈 or 线段树扫描线 ---- E. Delete a Segment [单调栈+二分] [扫描线处理空白位置的技巧乘2]

    题目链接 题目大意: 给出nnn个线段代表集合,现在问若可以将其中任意一个线段删除,则能够形成最多多少个独立的集合(取并集后) 解题思路1: 首先我们先对线段按照起点排序 那么我们枚举删除的线段iii ...

  6. 青春野狼不做姐控偶像的梦 - 线段树 - 扫描线 - 单调栈

    题目大意:给你一个排列,多次询问,每次给你一个区间,问有多少子区间,数字取出来sort一遍是连续的一段. 题解: 考虑l=1,r=n咋做. 考虑一段合法,当且仅当max-min=r-l. 那么用个单调 ...

  7. 【51Nod - 1215 】数组的宽度 (单调栈 或 分治 或 单调队列,算贡献,需去重)

    题干: N个整数组成的数组,定义子数组aii..ajj的宽度为:max(ai..aj) - min(ai..aj),求所有子数组的宽度和. Input 第1行:1个数N,表示数组的长度.(1 < ...

  8. BZOJ 3238: [Ahoi2013]差异 [后缀数组 单调栈]

    3238: [Ahoi2013]差异 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 2326  Solved: 1054 [Submit][Stat ...

  9. LeetCode第 57 场力扣夜喵双周赛(差分数组、单调栈) and 第 251 场力扣周赛(状态压缩动规,树的序列化,树哈希,字典树)

    LeetCode第 57 场力扣夜喵双周赛 离knight勋章越来越近,不过水平没有丝毫涨进 1941. 检查是否所有字符出现次数相同 题目描述 给你一个字符串 s ,如果 s 是一个 好 字符串,请 ...

  10. POJ2796 Feel Good(单调栈)

    题意: 给出一列数据,要求一个区间内最小值与区间内数据总和乘积最大值 要点: 还是单调栈,这次我自己写的,先做了几题比较简单的果然还是有效果的,这题也是一样,按点遍历,网上大神做的是直接遍历一次即可, ...

最新文章

  1. APNIC执委赵巍:IPv4向IPv6过渡再无退路
  2. ensp查看历史配置命令_华为eNSP常用命令
  3. 操作对象_DOM进阶——HTML属性操作(对象属性)
  4. 操作系统死机的12个问题
  5. scale data:线性空间映射
  6. 计算机硬盘型号怎么看,硬盘编号怎么看
  7. PostgreSQL extension 参数
  8. Antd 表格样式修改
  9. 901虎年期待和变元的哥德尔数配置——哥德尔原著英译本拆解汉译之五
  10. 情感原因识别相关论文整理
  11. 虚幻UE4/5中如何使用材质节点旋转贴图
  12. 用html写京东网页,实现部分功能
  13. 前端工程化-husky+commitizen+ 自定义cz-customizable适配器 git 提交代码规范化
  14. jcyzoj1505: 原地tp
  15. Ubuntu18.04安装QQ、网易云音乐、百度云盘、搜狗输入法
  16. Chrome无头模式获取直播间弹幕
  17. python识别图片验证码,踩坑亲测
  18. 2022R2移动式压力容器充装考试试题模拟考试平台操作
  19. Kong网关简介安装
  20. 保龄球游戏的获胜者、找出叠涂元素----2023/4/30

热门文章

  1. Linux printf Class.this git rebase Persistent Bugger
  2. 计算机考试彩虹云朵,抖音王源彩虹云朵歌曲歌词完整版
  3. 批处理遍历当前目录和子目录查找指定后缀名的文件并修改后缀名
  4. 计算机网络各层设备及作用
  5. 个人百科怎么做,如何申请个人百度百科
  6. obd协议 混动车_OBD协议
  7. 华纳云:香港服务器哪家比较好?
  8. php设置Apache虚拟主机vhost
  9. 冷色系清新调、日系清新调 、电影色调复古风、欧美风复古,用曲线就可以调了!!!...
  10. 麻将开金算法java代_通用麻将胡牌算法