题目链接

BZOJ4826

题解

蒟蒻智力水平捉急orz

我们会发现相邻的\(i\)和\(j\)贡献一定是\(p1\),可以很快算出来【然而我一开始忘了考虑调了半天】

我们现在只考虑不相邻的

我们只需要找出所有产生贡献的\(i,j\)即可

我们发现每一个产生贡献的\(i,j\)都能对应到一个三元组\((i,k,j)\),分别对应区间的最大值,次大值,第三大值

我们枚举中间位置\(i\),找到\(i\)左边第一个比\(i\)大的位置\(L[i]\),右边第一个比\(i\)大的位置\(R[i]\)

那么\(L[i]\)和\(R[i]\)的贡献就是\(p1\)

区间\((L[i],i)\)和\(R[i]\)的贡献是\(p2\)

区间\((i,R[i])\)和\(L[i]\)的贡献是\(p2\)

一对点对询问产生贡献,当且仅当其都在区间中

所以我们可以用一个端点去储存贡献,而另一个端点作为更新的位置

然后再离线询问,用到\(r\)端点时区间\([l,r]\)的贡献减去到\(l - 1\)时区间\([l,r]\)的贡献,就是答案

#include<algorithm>
#include<iostream>
#include<cstdio>
#include<vector>
#include<cmath>
#define REP(i,n) for (int i = 1; i <= (n); i++)
#define LL long long int
#define ls (u << 1)
#define rs (u << 1 | 1)
using namespace std;
const int maxn = 200005,maxm = 100005,INF = 1000000000;
inline int read(){
int out = 0,flag = 1; char c = getchar();
while (c < 48 || c > 57){if (c == '-') flag = -1; c = getchar();}
while (c >= 48 && c <= 57){out = (out << 3) + (out << 1) + c - 48; c = getchar();}
return out * flag;
}
struct node{int l,r;};
struct Que{int l,r,pos,t,id;}q[maxn << 1];
vector<node> Ln[maxn],Rn[maxn];
LL ans[maxn];
LL A[maxn],n,m,p1,p2,qi;
LL st[maxn],top,Li[maxn],Ri[maxn];
LL sum[maxn << 2],tag[maxn << 2];
inline bool operator <(const Que& a,const Que& b){
return a.pos < b.pos;
}
void upd(int u){sum[u] = sum[ls] + sum[rs];}
void pd(int u,int l,int r){
if (tag[u]){
int mid = l + r >> 1;
sum[ls] += tag[u] * (mid - l + 1);
sum[rs] += tag[u] * (r - mid);
tag[ls] += tag[u]; tag[rs] += tag[u];
tag[u] = 0;
}
}
void add(int u,int l,int r,int L,int R,LL v){
if (l >= L && r <= R){sum[u] += v * (r - l + 1); tag[u] += v; return;}
pd(u,l,r);
int mid = l + r >> 1;
if (mid >= L) add(ls,l,mid,L,R,v);
if (mid < R) add(rs,mid + 1,r,L,R,v);
upd(u);
}
LL query(int u,int l,int r,int L,int R){
if (l >= L && r <= R) return sum[u];
pd(u,l,r);
int mid = l + r >> 1;
if (mid >= R) return query(ls,l,mid,L,R);
if (mid < L) return query(rs,mid + 1,r,L,R);
return query(ls,l,mid,L,R) + query(rs,mid + 1,r,L,R);
}
void init(){
for (int i = 1; i <= n; i++){
while (top && A[i] > A[st[top]]) top--;
Li[i] = st[top];
st[++top] = i;
}
st[0] = n + 1; top = 0;
for (int i = n; i; i--){
while (top && A[i] > A[st[top]]) top--;
Ri[i] = st[top];
st[++top] = i;
}
for (int i = 1; i <= n; i++){
//printf("pos: %d L:[%d,%d] R:[%d,%d]\n",i,Li[i] + 1,i - 1,i + 1,Ri[i] - 1);
if (Li[i])
Ln[Li[i]].push_back((node){i + 1,Ri[i] - 1});
if (Ri[i] <= n)
Rn[Ri[i]].push_back((node){Li[i] + 1,i - 1});
}
}
void solve(){
sort(q + 1,q + 1 + qi); int l,r,pos = 1;
for (int i = 0; i <= n; i++){
for (unsigned int j = 0; j < Ln[i].size(); j++){
l = Ln[i][j].l; r = Ln[i][j].r;
if (l <= r) add(1,1,n,l,r,p2);
}
for (unsigned int j = 0; j < Rn[i].size(); j++){
l = Rn[i][j].l; r = Rn[i][j].r;
if (l <= r) add(1,1,n,l,r,p2);
if (l - 1 > 0) add(1,1,n,l - 1,l - 1,p1);
}
while (pos <= qi && q[pos].pos == i){
ans[q[pos].id] += query(1,1,n,q[pos].l,q[pos].r) * q[pos].t;
pos++;
}
}
for (int i = 1; i <= m; i++)
printf("%lld\n",ans[i]);
}
int main(){
n = read(); m = read(); p1 = read(); p2 = read(); int l,r;
for (int i = 1; i <= n; i++) A[i] = read();
for (int i = 1; i <= m; i++){
l = read(); r = read();
q[++qi] = (Que){l,r,l - 1,-1,i};
q[++qi] = (Que){l,r,r,1,i};
ans[i] += 1ll * (r - l) * p1;
}
init();
solve();
return 0;
}

BZOJ4826 [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. Codeforces 781E Andryusha and Nervous Barriers 线段树 单调栈

    原文链接https://www.cnblogs.com/zhouzhendong/p/CF781E.html 题目传送门 - CF781E 题意 有一个矩形,宽为 w ,高为 h .一开始会有 w 个 ...

  3. 洛谷P4425 转盘 [HNOI/AHOI2018] 线段树+单调栈

    正解:线段树+单调栈 解题报告: 传送门! 1551又是一道灵巧连题意都麻油看懂的题,,,,所以先解释一下题意好了,,,, 给定一个n元环 可以从0时刻开始从任一位置出发 每次可以选择向前走一步或者在 ...

  4. 线段树+单调栈+前缀和--2019icpc南昌网络赛I

    线段树+单调栈+前缀和--2019icpc南昌网络赛I Alice has a magic array. She suggests that the value of a interval is eq ...

  5. 牛客多校第四场sequence C (线段树+单调栈)

    牛客多校第四场sequence C (线段树+单调栈) 传送门:https://ac.nowcoder.com/acm/contest/884/C 题意: 求一个$\max {1 \leq l \le ...

  6. Codeforces 1175F - The Number of Subpermutations(线段树+单调栈+双针/分治+启发式优化)

    Codeforces 题面传送门 & 洛谷题面传送门 由于这场的 G 是道毒瘤题,蒟蒻切不动就只好来把这场的 F 水掉了 看到这样的设问没人想到这道题吗?那我就来发篇线段树+单调栈的做法. 首 ...

  7. [Codeforces1132G]Greedy Subsequences——线段树+单调栈

    题目链接: Codeforces1132G 题目大意:给定一个序列$a$,定义它的最长贪心严格上升子序列为$b$满足若$a_{i}$在$b$中则$a_{i}$之后第一个比它大的也在$b$中.给出一个数 ...

  8. BZOJ.4540.[HNOI2016]序列(莫队/前缀和/线段树 单调栈 RMQ)

    BZOJ 洛谷 ST表的一二维顺序一定要改过来. 改了就rank1了哈哈哈哈.自带小常数没办法. \(Description\) 给定长为\(n\)的序列\(A_i\).\(q\)次询问,每次给定\( ...

  9. AtCoder Regular Contest 063 F : Snuke’s Coloring 2 (线段树 + 单调栈)

    题意 小 \(\mathrm{C}\) 很喜欢二维染色问题,这天他拿来了一个 \(w × h\) 的二维平面 , 初始时均为白色 . 然后他在上面设置了 \(n\) 个关键点 \((X_i , Y_i ...

  10. cdqz2017-test10-rehearsal(CDQ分治&可持久化线段树&单调栈)

    题意: 给出n个三元组 e[i]=(si,ti,wi) 第i个三元组的价值为 Σ w[j] ,j 满足以下4个条件: 1.j<i 2.tj<ti 3.sj<si 4.不存在j< ...

随机推荐

  1. 关于 Angular引用Material出现node_modules/@angular/material/button-toggle/typings/button-toggle.d.ts(154,104): error TS2315: Type 'ElementRef' is not generic.问题

    百度了好久 ,,,最后谷歌出来了.. 该错误可能来自于您将@ angular / material设置为6.0.0, 但所有其他Angular包都是5.x.您应该始终确保Material主要版本与An ...

  2. python导包语句执行

    今天在做项目中遇到一个问题,在first_page中引用login的登录方法,第一次执行登录可以正常登录,登录成功后,再选择返回主菜单,回到上个页面,再选择登录时报错“login_class isno ...

  3. JZOJ 1738. Heatwave

    Description 给你N个点的无向连通图,图中有M条边,第j条边的长度为: d_j. 现在有 K个询问. 每个询问的格式是:A B,表示询问从A点走到B点的所有路径中,最长的边最小值是多少? I ...

  4. Spark机器学习之推荐引擎

    一. 最小二乘法建立模型 关于最小二乘法矩阵分解,我们可以参阅: 一.矩阵分解模型. 用户对物品的打分行为可以表示成一个评分矩阵A(m*n),表示m个用户对n各物品的打分情况.如下图所示: 其中,A( ...

  5. 20145202马超《java程序设计》第一周学习总结

    这两天的学习让我对java有了初步的了解. 1.java是SUN公司推出的面相网络的编程语言. 特点:完全面向对象,与平台无关,跨平台性(例如c++只能在windows上执行,然而java并没有这些限 ...

  6. nodejs安装&bower 安装

    1.进入官网下载:https://nodejs.org/en/ 2.直接进行安装,可以将安装路径设置为:D:\nodejs 3.进入node.js command prompt 命令窗口 4.检测是否 ...

  7. HNOI2018 摸鱼记

    HNOI2018 摸鱼记 今天我又来记流水账啦 Day 0 颓废的一天. 我,球爷和杜教在颓膜膜.io ych看起来在搓碧蓝 鬼知道哥达鸭干了什么 学习氛围只局限在机房的一角 后来全体Oier开会,5 ...

  8. Spring 各种注解备注

    Spring 各种注解备注 felix_feng 关注 2016.12.28 10:34* 字数 2092 阅读 790评论 0喜欢 6 转载 (http://blog.csdn.net/sudilu ...

  9. python学习笔记七:浅拷贝深拷贝

    原理 浅拷贝 import copy b = copy.copy(a) demo: >>> a=[1,['a']] >>> b=a >>> c=c ...

  10. 【Feasibility of Learning】林轩田机器学习基石

    这一节的核心内容在于如何由hoeffding不等式 关联到机器学习的可行性. 这个PAC很形象又准确,描述了“当前的可能性大概是正确的”,即某个概率的上届. hoeffding在机器学习上的关联就是: ...