bzoj 4826: [Hnoi2017]影魔【单调栈+树状数组+扫描线】
参考:https://www.cnblogs.com/lcf-2000/p/6789680.html
这是一个相对码量少的做法,用到了区间修改区间查询的树状数组,详见:www.cnblogs.com/lcf-2000/p/5866170.html#3830447
枚举最大值a[i],找到l[i],r[i]是左边最后一个比它大的和右边第一个比它大的,考虑贡献:
p1:每次询问要先加上(r-l)*p1是点对相邻,然后对r[i]有p1贡献的左端点是l[i]
p2:对l[i]有贡献的是(i+1,r[i]-1),对r[i]有贡献的是(l[i]+1,i-1)
离线排序+扫描线做就行,情况都要考虑到。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=400005;
int n,m,p1,p2,a[N],s[N],top,r[N],l[N],tot;
long long ans[N],c1[N],c2[N];
struct qwe
{
int l,r,x,b,z;
qwe(int L=0,int R=0,int X=0,int B=0,int Z=0)
{
l=L,r=R,x=X,b=B,z=Z;
}
}b[N],c[N];
bool cmp(const qwe &a,const qwe &b)
{
return a.x<b.x;
}
int read()
{
int r=0,f=1;
char p=getchar();
while(p>'9'||p<'0')
{
if(p=='-')
f=-1;
p=getchar();
}
while(p>='0'&&p<='9')
{
r=r*10+p-48;
p=getchar();
}
return r*f;
}
int lb(int x)
{
return x&(-x);
}
void add(int x,int v)
{
if(!x)
return;
for(int i=x;i<=n;i+=lb(i))
c1[i]+=v,c2[i]+=1ll*x*v;
}
long long ques(int x)
{
long long re=0;
for(int i=x;i>0;i-=lb(i))
re+=(x+1)*c1[i]-c2[i];
return re;
}
int main()
{
n=read(),m=read(),p1=read(),p2=read();
a[0]=a[n+1]=n+1;
s[top=1]=0;
for(int i=1;i<=n+1;i++)
{
if(i<=n)
a[i]=read();
while(a[s[top]]<a[i])
r[s[top--]]=i;
l[i]=s[top];
s[++top]=i;
}
for(int i=1;i<=m;i++)
{
int l=read(),r=read();
ans[i]+=(r-l)*p1;//相邻两个点产生的贡献
b[i]=qwe(l,r,l-1,i,-1);
b[i+m]=qwe(l,r,r,i,1);
}
sort(b+1,b+1+2*m,cmp);
for(int i=1;i<=n;i++)
{
if(l[i]&&r[i]<=n)
c[++tot]=qwe(l[i],l[i],r[i],0,p1);
if(l[i]&&r[i]>i+1)
c[++tot]=qwe(i+1,r[i]-1,l[i],0,p2);
if(r[i]<=n&&i>l[i]+1)
c[++tot]=qwe(l[i]+1,i-1,r[i],0,p2);
}
sort(c+1,c+1+tot,cmp);
int w1=1,w2=1;
while(!b[w1].x)
w1++;
for(int i=1;w1<=m*2&&i<=n;i++)//扫描线
{
while(w2<=tot&&c[w2].x==i)
{
add(c[w2].r+1,-c[w2].z);
add(c[w2].l,c[w2].z);
w2++;
}
while(w1<=2*m&&b[w1].x==i)
{
ans[b[w1].b]+=b[w1].z*(ques(b[w1].r)-ques(b[w1].l-1));
w1++;
}
}
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 影魔,奈文摩尔,据说有着一个诗人的灵魂.事实上,他吞噬的诗人灵魂早已成千上万.千百年来,他收集了各式各样 的灵魂,包括诗人.牧师.帝王.乞丐.奴隶.罪人,当然,还有英雄.每一个 ...
- 牛客小白月赛13-H(单调栈+树状数组)
题目链接:https://ac.nowcoder.com/acm/contest/549/H 题意:给一个柱状图,包括每个矩阵的宽度和高度,求能组成的最大矩阵的面积. 思路:显然最大矩阵的高一定为n个 ...
- Codeforces 786C Till I Collapse(树状数组+扫描线+倍增)
[题目链接] http://codeforces.com/contest/786/problem/C [题目大意] 给出一个数列,问对于不同的k,将区间划分为几个, 每个区间出现不同元素个数不超过k时 ...
- bzoj 4826: [Hnoi2017]影魔 [主席树 单调栈]
4826: [Hnoi2017]影魔 题意:一个排列,点对\((i,j)\),\(p=max(i+1,j-1)\),若\(p<a_i,a_j\)贡献p1,若\(p\)在\(a_1,a_2\)之间 ...
- 【BZOJ4826】[Hnoi2017]影魔 单调栈+扫描线
[BZOJ4826][Hnoi2017]影魔 Description 影魔,奈文摩尔,据说有着一个诗人的灵魂.事实上,他吞噬的诗人灵魂早已成千上万.千百年来,他收集了各式各样的灵魂,包括诗人.牧师.帝 ...
- BZOJ 2819: Nim dfs序维护树状数组,倍增
1.随机选两个堆v,u,询问若在v到u间的路径上的石子堆中玩Nim游戏,是否有必胜策略,如果有,vfleaking将会考虑将这些石子堆作为初始局面之一,用来坑玩家.2.把堆v中的石子数变为k. 分析: ...
- BZOJ.4888.[TJOI2017]异或和(树状数组)
BZOJ 洛谷 \(Description\) 求所有区间和的异或和. \(n\leq 10^5,\ \sum a_i\leq 10^6\). \(Solution\) 这样的题还是要先考虑按位做. ...
- BZOJ.4553.[HEOI2016&TJOI2016]序列(DP 树状数组套线段树/二维线段树(MLE) 动态开点)
题目链接:BZOJ 洛谷 \(O(n^2)\)DP很好写,对于当前的i从之前满足条件的j中选一个最大值,\(dp[i]=d[j]+1\) for(int j=1; j<i; ++j) if(a[ ...
随机推荐
- 寒武纪camp Day1
补题进度:8/10 A(组合计数) 题意: 一个人站在数轴原点,每秒有1/4概率向前走一步,1/4概率向后走一步,1/2概率不动,问t秒后在p位置的概率. t,p<=100000 分析: 枚举不 ...
- loj6171/bzoj4899 记忆的轮廊(期望dp+优化)
题目: https://loj.ac/problem/6171 分析: 设dp[i][j]表示从第i个点出发(正确节点),还可以有j个存档点(在i点使用一个存档机会),走到终点n的期望步数 那么 a[ ...
- php 获取TZ时间格式
php将时间格式化成T Z的方法 gmdate("c") 这个函数的用法,学会了吧!!! <?php var_dump(gmdate("c")); ini ...
- win10 localhost 解析为::1 的解决办法
win10 localhost 解析为::1 的解决办法 学习了:https://blog.csdn.net/ambertian/article/details/70238020
- Leetcode:search_insert_position
一. 题目 给定一个数组和要插入数的大小.求插入的位置. 二. 分析 太水,直接扫描.过--. class Solution { public: int searchInsert(in ...
- Pacemaker 安装与使用
Pacemaker 仅仅做资源管理器(CRM).底下的消息系统採用 corosync. 安装 以 ubuntu 为例, sudo aptitude install -y pacemaker coros ...
- java递归删除文件及目录
package base; import java.io.File; public class delete { public static void main(String[] args) ...
- 一起talk C栗子吧(第一百二十四回:C语言实例--内置宏)
各位看官们,大家好,上一回中咱们说的是显示变量和函数地址的样例,这一回咱们说的样例是:内置宏.闲话休提,言归正转.让我们一起talk C栗子吧! 看官们,我们在编译程序的时候,假设有语法错误,编译器就 ...
- UML之实现图
我们前面学过的用例图.类图.活动图.顺序图和协作图都描写叙述了逻辑和设计方面的信息.那么如今我们来学习和实现有关的两个图:构件图和部署图. 实现图用来描写叙述实现方面的信息,它从系统的层次来描写叙述下 ...
- 设计模式-(8)外观(swift版)
一,概念 为子系统中的一组接口提供一个统一的接口.外观模式定义了一个更高层次的接口,这个接口使得这一子系统更加容易使用. 二,结构图 (1)SubSystem子系统类:每个子系统定义了相关功能和模块的 ...