Problem

BZOJ

题外话

这道题有点类似于HNOI2016序列。好像并没有莫队做法,但是挺想打莫队的。。

Cai表示莫队被卡了:

Solution

先用单调栈处理出每个点的pre和nxt,即左边和右边第一个比更大的位置。
考虑对于点i,在区间[pre[i],nxt[i]]之间,p1只对于点对(pre[i],nxt[i])和相邻点对有贡献。当然了,pre[i]和i的贡献已经被区间内的点算过了(i和nxt[i]亦然)。
考虑p2的贡献,我们选取pre[i]和区间(i,nxt[i])之间可以做p2的贡献,等效的还有选取nxt[i]和区间(pre[i],i)之间的。
我们考虑按照坐标来进行扫描,因为如pre[i]和区间(i,nxt[i])做的p2贡献扫了l之后,还需要选取后面的数字才会生效,那么我们就设定一个生效坐标pos,作为排序依据。然后上支持区间修改的树状数组。

Code

#include <algorithm>
#include <cstdio>
#define lowbit(x) ((x)&(-(x)))
using namespace std;
typedef long long ll;
const int maxn=200010;
int n,m,p1,p2,cnt,pre[maxn],nxt[maxn],a[maxn];
ll ans[maxn],t1[maxn],t2[maxn];
struct data{int l,r,pos,id,val;bool operator < (const data &x)const{return pos<x.pos;}
}q1[maxn<<1],q2[maxn*3];
struct STACK{int tp,a[maxn];void clear(){tp=0;}int top(){return a[tp];}void push(int val){a[++tp]=val;}void pop(){tp--;}
}s;
template <typename Tp> inline void read(Tp &x)
{x=0;char ch=getchar();while(ch<'0'||ch>'9') ch=getchar();while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
}
void input()
{read(n);read(m);read(p1);read(p2);s.clear();for(int i=1;i<=n;i++){read(a[i]);while(s.tp&&a[s.top()]<a[i]) nxt[s.top()]=i,s.pop();pre[i]=s.top();s.push(i);}while(s.tp) nxt[s.top()]=n+1,s.pop();for(int i=1,l,r;i<=m;i++){read(l);read(r);ans[i]+=(r-l)*p1;q1[i]=(data){l,r,l-1,i,-1};q1[i+m]=(data){l,r,r,i,1};}sort(q1+1,q1+m+m+1);
}
void add(int pos,int val)
{int ps=pos;while(pos<=n){t1[pos]+=val;t2[pos]+=(ll)ps*val;pos+=lowbit(pos);}
}
ll query(int pos)
{ll res=0,ps=pos;while(pos){res+=(ps+1)*t1[pos]-t2[pos];pos-=lowbit(pos);}return res;
}
int main()
{#ifndef ONLINE_JUDGEfreopen("in.txt","r",stdin);#endifinput();for(int i=1;i<=n;i++){if(pre[i]&&nxt[i]<=n) q2[++cnt]=(data){pre[i],pre[i],nxt[i],0,p1};if(pre[i]&&nxt[i]>i+1) q2[++cnt]=(data){i+1,nxt[i]-1,pre[i],0,p2};if(nxt[i]<=n&&i>pre[i]+1) q2[++cnt]=(data){pre[i]+1,i-1,nxt[i],0,p2};}sort(q2+1,q2+cnt+1);p1=p2=1;while(!q1[p1].pos) p1++;for(int i=1;p1<=m+m&&i<=n;i++){while(p2<=cnt&&q2[p2].pos==i){add(q2[p2].r+1,-q2[p2].val);add(q2[p2].l,q2[p2].val);p2++;}while(p1<=m+m&&q1[p1].pos==i){ans[q1[p1].id]+=q1[p1].val*(query(q1[p1].r)-query(q1[p1].l-1));p1++;}}for(int i=1;i<=m;i++) printf("%lld\n",ans[i]);return 0;
}

BZOJ 4826 HNOI2017 影魔相关推荐

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

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

  2. bzoj 4826: [Hnoi2017]影魔

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

  3. bzoj 4826 [Hnoi2017]影魔

    http://www.elijahqi.win/archives/3687 Description 影魔,奈文摩尔,据说有着一个诗人的灵魂.事实上,他吞噬的诗人灵魂早已成千上万.千百年来,他收集了各式 ...

  4. 4826: [Hnoi2017]影魔

    题目链接 对于每组询问,分别考虑p1p_1类型和p2p_2类型对答案的贡献 预处理preipre_i表示在灵魂ii左边第一个战斗力比它大的灵魂 类似的预处理nexinex_i 那么,所有满足贡献为p1 ...

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

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

  6. [AH2017/HNOI2017] 影魔

    [AH2017/HNOI2017]影魔 30pts 暴力在每个区间中枚举点对(a,b)(a,b)(a,b)并查询点对之间的最大值maxmaxmax,若max<=min(a,b)max<=m ...

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

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

  8. [AH2017/HNOI2017]影魔

    P3722 [AH2017/HNOI2017]影魔 题解: 法一: [bzoj4826][HNOI2017]影魔 直接转化成区间内单点的贡献, 分开p1,p2考虑 而min(ai,aj),max(ai ...

  9. AC日记——[Hnoi2017]影魔 bzoj 4826

    4826 思路: 主席树矩阵加减+单调栈预处理: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 200005 ...

  10. BZOJ 4826 【HNOI2017】 影魔

    题目链接:影魔 这道题就是去年序列的弱化版啊-- 我们枚举最大值的位置\(i\),找出左边第一个比\(a_i\)大的位置\(l\),右边第一个比\(a_i\)大的位置\(r\),然后我们分开考虑一下\ ...

最新文章

  1. MySQL 视图技术
  2. Work Management Service application in SharePoint 2016
  3. 匿名类java的说明_Java8 Lambdas与匿名类
  4. CVPR 2019 | 基于骨架表达的单张图片三维物体重建方法
  5. 测试—自定义消息处理
  6. mysql5.5索引,MySQL--5索引选择原则
  7. toolbar java_Java ToolBar.layout方法代码示例
  8. 中小机房UPS电源及环境多方式在线监控和告警方案
  9. .text urlRewrite介绍
  10. c语言头文件的使用和写法,C语言头文件的使用与写法
  11. js判断移动端还是pc端
  12. DRM2.0 的身份认证过程
  13. 建广数科(文思海辉)招聘
  14. 测试智商多高的软件,测测你的智商多高 国际标准智商测试30题
  15. 201671010457 朱石景 实验四《英文文本词频统计分析》 结对项目报告
  16. 安装EPICS synApps中的软件包
  17. pytorch Module里的children()与modules()的区别
  18. C语言的编译过程常见的错误和警告
  19. 什么是函数指针?(理解及使用)
  20. 蒙特卡洛-马尔科夫链(MCMC)初步

热门文章

  1. 服务器显示checkin,CheckIn 方法 - Microsoft Word Visual Basic 参考
  2. Android学习日记(yzy):SQLite数据库和baseAdapter
  3. 一些有关MATLAB使用的基础习题
  4. 笔记本独立显卡geforce gtx 1050ti 388.71版本驱动
  5. matlab中acos得到的弧度范围,C语言acos()函数:求余弦值为 x 的弧度数
  6. 永恒之蓝的简单介绍以及利用
  7. 技能竞赛中职计算机课程建设,从计算机辅助设计(工业产品CAD)竞赛谈中职学校计算机应用专业建设.pdf...
  8. python搬家具_python3 摆放家具练习
  9. 光圈,焦距,工作距离与景深之间的关系。
  10. vue项目中对于Scroll事件的节流优化