BZOJ 4826 HNOI2017 影魔
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 影魔相关推荐
- BZOJ 4826: [Hnoi2017]影魔 单调栈 主席树
https://www.lydsy.com/JudgeOnline/problem.php?id=4826 年少不知空间贵,相顾mle空流泪. 和上一道主席树求的东西差不多,求两种对 1. max(a ...
- bzoj 4826: [Hnoi2017]影魔
Description 影魔,奈文摩尔,据说有着一个诗人的灵魂.事实上,他吞噬的诗人灵魂早已成千上万.千百年来,他收集了各式各样 的灵魂,包括诗人.牧师.帝王.乞丐.奴隶.罪人,当然,还有英雄.每一个 ...
- bzoj 4826 [Hnoi2017]影魔
http://www.elijahqi.win/archives/3687 Description 影魔,奈文摩尔,据说有着一个诗人的灵魂.事实上,他吞噬的诗人灵魂早已成千上万.千百年来,他收集了各式 ...
- 4826: [Hnoi2017]影魔
题目链接 对于每组询问,分别考虑p1p_1类型和p2p_2类型对答案的贡献 预处理preipre_i表示在灵魂ii左边第一个战斗力比它大的灵魂 类似的预处理nexinex_i 那么,所有满足贡献为p1 ...
- [BZOJ4826][HNOI2017]影魔(主席树)
4826: [Hnoi2017]影魔 Time Limit: 20 Sec Memory Limit: 512 MB Submit: 669 Solved: 384 [Submit][Status ...
- [AH2017/HNOI2017] 影魔
[AH2017/HNOI2017]影魔 30pts 暴力在每个区间中枚举点对(a,b)(a,b)(a,b)并查询点对之间的最大值maxmaxmax,若max<=min(a,b)max<=m ...
- 【BZOJ4826】[Hnoi2017]影魔 单调栈+扫描线
[BZOJ4826][Hnoi2017]影魔 Description 影魔,奈文摩尔,据说有着一个诗人的灵魂.事实上,他吞噬的诗人灵魂早已成千上万.千百年来,他收集了各式各样的灵魂,包括诗人.牧师.帝 ...
- [AH2017/HNOI2017]影魔
P3722 [AH2017/HNOI2017]影魔 题解: 法一: [bzoj4826][HNOI2017]影魔 直接转化成区间内单点的贡献, 分开p1,p2考虑 而min(ai,aj),max(ai ...
- AC日记——[Hnoi2017]影魔 bzoj 4826
4826 思路: 主席树矩阵加减+单调栈预处理: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 200005 ...
- BZOJ 4826 【HNOI2017】 影魔
题目链接:影魔 这道题就是去年序列的弱化版啊-- 我们枚举最大值的位置\(i\),找出左边第一个比\(a_i\)大的位置\(l\),右边第一个比\(a_i\)大的位置\(r\),然后我们分开考虑一下\ ...
最新文章
- MySQL 视图技术
- Work Management Service application in SharePoint 2016
- 匿名类java的说明_Java8 Lambdas与匿名类
- CVPR 2019 | 基于骨架表达的单张图片三维物体重建方法
- 测试—自定义消息处理
- mysql5.5索引,MySQL--5索引选择原则
- toolbar java_Java ToolBar.layout方法代码示例
- 中小机房UPS电源及环境多方式在线监控和告警方案
- .text urlRewrite介绍
- c语言头文件的使用和写法,C语言头文件的使用与写法
- js判断移动端还是pc端
- DRM2.0 的身份认证过程
- 建广数科(文思海辉)招聘
- 测试智商多高的软件,测测你的智商多高 国际标准智商测试30题
- 201671010457 朱石景 实验四《英文文本词频统计分析》 结对项目报告
- 安装EPICS synApps中的软件包
- pytorch Module里的children()与modules()的区别
- C语言的编译过程常见的错误和警告
- 什么是函数指针?(理解及使用)
- 蒙特卡洛-马尔科夫链(MCMC)初步
热门文章
- 服务器显示checkin,CheckIn 方法 - Microsoft Word Visual Basic 参考
- Android学习日记(yzy):SQLite数据库和baseAdapter
- 一些有关MATLAB使用的基础习题
- 笔记本独立显卡geforce gtx 1050ti 388.71版本驱动
- matlab中acos得到的弧度范围,C语言acos()函数:求余弦值为 x 的弧度数
- 永恒之蓝的简单介绍以及利用
- 技能竞赛中职计算机课程建设,从计算机辅助设计(工业产品CAD)竞赛谈中职学校计算机应用专业建设.pdf...
- python搬家具_python3 摆放家具练习
- 光圈,焦距,工作距离与景深之间的关系。
- vue项目中对于Scroll事件的节流优化