题意

题目链接

Sol

题解好神仙啊qwq。

一般看到这种考虑最大值的贡献的题目不难想到单调数据结构

对于本题而言,我们可以预处理出每个位置左边第一个比他大的位置\(l_i\)以及右边第一个比他大的位置\(r_i\)

那么\((l_i, r_i)\)会产生\(p1\)的贡献

\([l_i + 1, i - 1]\)和\(r_i\)会产生\(p2\)的贡献

\([i + 1, r_i - 1]\)和\(l_i\)会产生\(p2\)的贡献

这样我们直接上区间加线段树就能统计到每个点的贡献了。

然后统计答案非常神仙,我们把询问拆开,当枚举到\(l - 1\)时,记此时\([l,r]\)的\(sum\)为\(s1\),当枚举到\(r\)时,记此时\([l, r]\)的\(sum\)为s2,那么该询问的答案为\(s2 - s1\)

复杂度:\(O(nlogn)\)

#include<bits/stdc++.h>
#define LL long long
using namespace std;
const int MAXN = 1e6 + 10, INF = 1e9 + 10;
inline int read() {
char c = getchar(); int x = 0, f = 1;
while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}
while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
return x * f;
}
int N, M, p1, p2, a[MAXN], L[MAXN], R[MAXN];
LL ans[MAXN];
int ll[MAXN], rr[MAXN];
LL sum[MAXN], f[MAXN];
#define ls k << 1
#define rs k << 1 | 1
void ps(int k, int v) {
sum[k] += (rr[k] - ll[k] + 1) * v;
f[k] += v;
}
void pushdown(int k) {
if(!f[k]) return ;
ps(ls, f[k]); ps(rs, f[k]);
f[k] = 0;
}
void update(int k) {
sum[k] = sum[ls] + sum[rs];
}
void Build(int k, int l, int r) {
ll[k] = l; rr[k] = r;
if(l == r) return ;
int mid = l + r >> 1;
Build(ls, l, mid); Build(rs, mid + 1, r);
}
void IntAdd(int k, int l, int r, int ql, int qr, int v) {
if(ql > qr) return ;
if(ql <= l && r <= qr) {ps(k, v); return ;}
pushdown(k);
int mid = l + r >> 1;
if(ql <= mid) IntAdd(ls, l, mid, ql, qr, v);
if(qr > mid) IntAdd(rs, mid + 1, r, ql, qr, v);
update(k);
}
LL IntQuery(int k, int l, int r, int ql, int qr) {
if(ql > qr) return 0;
if(ql <= l && r <= qr) return sum[k];
pushdown(k);
int mid = l + r >> 1;
if(ql > mid) return IntQuery(rs, mid + 1, r, ql, qr);
else if(qr <= mid) return IntQuery(ls, l, mid, ql, qr);
else return IntQuery(ls, l, mid, ql, qr) + IntQuery(rs, mid + 1, r, ql, qr);
}
struct Query {
int l, r, val, id;
bool operator < (const Query &rhs) const {
return id < rhs.id;
}
};
vector<Query> q[MAXN];
void Pre() {
a[0] = INF; a[N + 1] = INF;
static int st[MAXN], top = 0;
for(int i = 1; i <= N + 1; i++) {
while(top && a[i] > a[st[top]]) R[st[top--]] = i;
L[i] = st[top];
st[++top] = i;
}
for(int i = 1; i <= N; i++) {
q[R[i]].push_back({L[i], L[i], p1, -R[i]});
q[L[i]].push_back({i + 1, R[i] - 1, p2, -L[i]});
q[R[i]].push_back({L[i] + 1, i - 1, p2, -R[i]});
}
} int main() {
N = read(); M = read(); p1 = read(); p2 = read();
for(int i = 1; i <= N; i++) a[i] = read();
Pre();
Build(1, 0, N + 1);
for(int i = 1; i <= M; i++) {
int a = read(), b = read();
ans[i] = (b - a) * p1;
q[a - 1].push_back({a, b, -1, i});
q[b].push_back({a, b, 1, i});
}
for(int i = 0; i <= N; i++) {
sort(q[i].begin(), q[i].end());
for(auto &x : q[i]) {
if(x.id < 0) IntAdd(1, 0, N + 1, x.l, x.r, x.val);
else ans[x.id] += 1ll * x.val * (IntQuery(1, 0, N + 1, x.l, x.r));
}
}
for(int i = 1; i <= M; i++) cout << ans[i] << "\n";
return 0;
}

洛谷P3722 [AH2017/HNOI2017]影魔(线段树)的更多相关文章

  1. [AH2017/HNOI2017] 影魔 - 线段树

    #include<bits/stdc++.h> #define maxn 200010 using namespace std; int a[maxn],st[maxn][2],top,L ...

  2. 洛谷 P3373 【模板】线段树 2

    洛谷 P3373 [模板]线段树 2 洛谷传送门 题目描述 如题,已知一个数列,你需要进行下面三种操作: 将某区间每一个数乘上 xx 将某区间每一个数加上 xx 求出某区间每一个数的和 输入格式 第一 ...

  3. P3722 [AH2017/HNOI2017]影魔(单调栈+扫描线+线段树)

    题面传送门 首先我们把这两个贡献翻译成人话: 区间 \([l,r]\) 产生 \(p_1\) 的贡献当且仅当 \(a_l,a_r\) 分别为区间 \([l,r]\) 的最大值和次大值. 区间 \([l ...

  4. 洛谷P3372 【模板】线段树 1

    P3372 [模板]线段树 1 153通过 525提交 题目提供者HansBug 标签 难度普及+/提高 提交  讨论  题解 最新讨论 [模板]线段树1(AAAAAAAAA- [模板]线段树1 洛谷 ...

  5. 洛谷P4891 序列(势能线段树)

    洛谷题目传送门 闲话 考场上一眼看出这是个毒瘤线段树准备杠题,发现实在太难调了,被各路神犇虐哭qwq 考后看到各种优雅的暴力AC......宝宝心里苦qwq 思路分析 题面里面是一堆乱七八糟的限制和性 ...

  6. 洛谷 P2574 XOR的艺术(线段树 区间异或 区间求和)

    To 洛谷.2574 XOR的艺术 题目描述 AKN觉得第一题太水了,不屑于写第一题,所以他又玩起了新的游戏.在游戏中,他发现,这个游戏的伤害计算有一个规律,规律如下 1. 拥有一个伤害串为长度为n的 ...

  7. 洛谷P4344 脑洞治疗仪 [SHOI2015] 线段树+二分答案/分块

    !!!一道巨恶心的数据结构题,做完当场爆炸:) 首先,如果你用位运算的时候不小心<<打成>>了,你就可以像我一样陷入疯狂的死循环改半个小时 然后,如果你改出来之后忘记把陷入死循 ...

  8. Bzoj5294/洛谷P4428 [Bjoi2018]二进制(线段树)

    题面 Bzoj 洛谷 题解 考虑一个什么样的区间满足重组之后可以变成\(3\)的倍数.不妨设\(tot\)为一个区间内\(1\)的个数.如果\(tot\)是个偶数,则这个区间一定是\(3\)的倍数,接 ...

  9. 【题解】洛谷P1198 [JSOI2008] 最大数(线段树)

    洛谷P1198:https://www.luogu.org/problemnew/show/P1198 思路 一道水水的线段树 20分钟A掉 这道题只涉及到单点修改和区间查询 所以这道题甚至不用Laz ...

随机推荐

  1. Appium移动自动化测试入门及简单实例(python)

    1.介绍 Appium是一个移动端的自动化框架,可用于测试原生应用.移动网页应用和混合型应用,且是跨平台的.可用于IOS和Android以及firefox的操作系统.原生的应用是指用android或i ...

  2. Qt之实现网络下发配置的半透明友好提示界面

    一.说明 在使用Qt开发的网管客户端程序中,网管客户端主要负责显示设备信息以及对设备下发配置信息等,如配置设备名字.更新设备程序等:由于在网管客户端程序的操作要先经过服务器处理,再由服务器将该命令转发 ...

  3. enumerate使用

    # enumerate读取文件import enumfor index, line in enumerate(open('C:\\Users\\CTO\\Desktop\\spider\\douban ...

  4. Java 架构师+高并发+性能优化+Spring boot大型分布式项目实战

    视频课程内容包含: 高级 Java 架构师包含:Spring boot.Spring cloud.Dubbo.Redis.ActiveMQ.Nginx.Mycat.Spring.MongoDB.Zer ...

  5. 可以用软连接的方式解决linux内存空间不足的问题

    突然提示说/var空间满了,然后接着系统卡死,最后彻底没辙,重启试试,没想到提示什么系统错误,请联系管理员之类的提示语,也进不去登陆界面啥了.之后用其他电脑连接SSH用root账号访问. # cd / ...

  6. 【Eclipse】添加builder实现NDK的自动编译

    最近在做NDK相关的东西,Eclipse里面java的自动编译很方便,每次改动后就能自己编译显示错误,而NDK的C/C++文件就需要保存后再手动点build. 研究了下发现java code的自动编译 ...

  7. 从零开始学 Web 之 移动Web(一)屏幕相关基本知识,调试,视口,屏幕适配

    大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:ht ...

  8. Hadoop2源码分析-RPC探索实战

    1.概述 在<Hadoop2源码分析-RPC机制初识>博客中,我们对RPC机制有了初步的认识和了解,下面我们对Hadoop V2的RPC机制做进一步探索,在研究Hadoop V2的RPC机 ...

  9. docker 日志方案

    docker logs默认会显示命令的标准输出(STDOUT)和标准错误(STDERR).下面使用echo.sh和Dockerfile创建一个名为echo.v1的镜像,echo.sh会一直输出”hel ...

  10. SQL 必知必会·笔记<20>高级SQL特性

    1. 约束 约束(constraint)就是管理如何插入或处理数据库数据的规则.DBMS通过在数据库表上施加约束来实施引用完整性. 1.1 主键 主键是一种特殊的约束,用来保证一列(或一组列)中的值是 ...