luogu P4755 Beautiful Pair
这题有坨区间最大值,考虑最值分治.分治时每次取出最大值,然后考虑统计跨过这个位置的区间答案,然后两边递归处理.如果之枚举左端点,因为最大值确定,右端点权值要满足\(a_r\le \frac{\max a_k}{a_l}\),所以可以在主席树上询问区间内在一段值域内的数个数.不过如果左半边点数过多会被卡成暴力,这时枚举较小右半边即可.复杂度类似启发式合并,枚举的总点数为为\(O(nlogn)\),所以总复杂度为两个\(log\)
// luogu-judger-enable-o2
#include<bits/stdc++.h>
#define LL long long
#define uLL unsigned long long
#define db double
using namespace std;
const int N=1e5+10,inf=1<<30;
int rd()
{
int x=0,w=1;char ch=0;
while(ch<'0'||ch>'9'){if(ch=='-') w=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x*w;
}
int n,m,a[N],b[N],sq[N][2],bk[N];
LL ans;
#define mid ((l+r)>>1)
int s[N*30],ch[N*30][2],rt[N],tt;
void inst(int o1,int o2,int x)
{
int l=1,r=m;
s[o1]=s[o2]+1;
while(l<r)
{
if(x<=mid)
{
ch[o1][0]=++tt,ch[o1][1]=ch[o2][1];
o1=ch[o1][0],o2=ch[o2][0];
r=mid;
}
else
{
ch[o1][0]=ch[o2][0],ch[o1][1]=++tt;
o1=ch[o1][1],o2=ch[o2][1];
l=mid+1;
}
s[o1]=s[o2]+1;
}
}
int quer(int o1,int o2,int l,int r,int ll,int rr)
{
if(ll>rr||!s[o1]) return 0;
if(ll<=l&&r<=rr) return s[o1]-s[o2];
int an=0;
if(ll<=mid) an+=quer(ch[o1][0],ch[o2][0],l,mid,ll,rr);
if(rr>mid) an+=quer(ch[o1][1],ch[o2][1],mid+1,r,ll,rr);
return an;
}
int ma[N<<2];
bool zz=1;
int maxx(int aa,int bb){return a[aa]>=a[bb]?aa:bb;}
void p2(int o){ma[o]=maxx(ma[o<<1],ma[o<<1|1]);}
void bui(int o,int l,int r)
{
if(l==r){ma[o]=l;return;}
bui(o<<1,l,mid),bui(o<<1|1,mid+1,r);
p2(o);
}
int q2(int o,int l,int r,int ll,int rr)
{
if(ll<=l&&r<=rr) return ma[o];
int aa=0,bb=0;
if(ll<=mid) aa=q2(o<<1,l,mid,ll,rr);
if(rr>mid) bb=q2(o<<1|1,mid+1,r,ll,rr);
return maxx(aa,bb);
}
void sv(int l,int r)
{
if(l>r) return;
if(l==r){ans+=b[a[l]]==1;return;}
int md=q2(1,1,n,l,r);
if(md-l+1<r-md+1)
{
for(int i=md;i>=l;--i)
ans+=quer(rt[r],rt[md-1],1,m,1,upper_bound(b+1,b+m+1,b[a[md]]/b[a[i]])-b-1);
}
else
{
for(int i=md;i<=r;++i)
ans+=quer(rt[md],rt[l-1],1,m,1,upper_bound(b+1,b+m+1,b[a[md]]/b[a[i]])-b-1);
}
sv(l,md-1),sv(md+1,r);
}
int main()
{
n=rd();
for(int i=1;i<=n;++i) a[i]=b[i]=rd();
sort(b+1,b+n+1),m=unique(b+1,b+n+1)-b-1;
b[++m]=inf;
for(int i=1;i<=n;++i) a[i]=lower_bound(b+1,b+m+1,a[i])-b;
for(int i=1;i<=n;++i) inst(rt[i]=++tt,rt[i-1],a[i]);
bui(1,1,n);
sv(1,n);
printf("%lld\n",ans);
return 0;
}
luogu P4755 Beautiful Pair的更多相关文章
- 【题解】P4755 Beautiful Pair(启发式合并的思路+分治=启发式分治)
[题解]P4755 Beautiful Pair upd: 之前一个first second烦了,现在AC了 由于之前是直接抄std写的,所以没有什么心得体会,今天自己写写发现 不知道为啥\(90\) ...
- 洛谷 P4755 - Beautiful Pair(主席树+分治+启发式优化)
题面传送门 wssb,我紫菜 看到这类与最大值统计有关的问题可以很自然地想到分治,考虑对 \([l,r]\) 进行分治,求出对于所有 \(l\le x\le y\le r\) 的点对 \((x,y)\ ...
- Luogu 4755 Beautiful Pair
分治 + 主席树. 设$solve(l, r)$表示当前处理到$[l, r]$区间的情况,我们可以找到$[l, r]$中最大的一个数的位置$mid$,然后扫一半区间计算一下这个区间的答案. 注意,这时 ...
- P4755 Beautiful Pair
题目 洛谷 做法 \(i≤x≤j,a[i]<\frac{a[x]}{a[j]}\) 考虑\(a[x]\)的贡献,单调栈预处理\(L,R\)能作为最大值的区间 枚举一端点,仅需另一端点满足条件即可 ...
- 洛谷$P4755\ Beautiful\ Pair$ 最大值分治
正解:最大值分治 解题报告: 传送门$QwQ$ 昂考虑如果已经钦定了点$x$是这个$max$了,然后现在要求有多少对$[l,r]$满足$a_x=max\left\{a_i\right\},i\in[l ...
- P4755 Beautiful Pair (分治 + 主席树)
题意:1e5的数组 计算有多少对 ai * aj <= max(ai ai+1...aj-1 aj) 题解:在处理这种涉及到区间极值的题时 好像是个套路分治 从级值中间分成两个区间 从区间短的那 ...
- 「LGR-049」洛谷7月月赛 D.Beautiful Pair
「LGR-049」洛谷7月月赛 D.Beautiful Pair 题目大意 : 给出长度为 \(n\) 的序列,求满足 \(i \leq j\) 且 $a_i \times a_j \leq \max ...
- [luogu4755]Beautiful Pair
[luogu4755]Beautiful Pair luogu 第一次写最大值分治感觉有点丑 每次找到最大值mid,扫小的一边,主席树查大的一边小于等于\(\frac{a[mid]}{a[i]}\)的 ...
- luoguP4755 Beautiful Pair
https://www.luogu.org/problemnew/show/P4755 考虑分治,在 [l, r] 区间中用线段树找到最大的一个点,处理经过它的可行数对的个数,统计个数可以离线树状数组 ...
随机推荐
- 学习笔记01:《开放平台产品成长之路-POP》
当看到一些比较好的书籍和视频内容时,希望自己可以总价归纳下来,一方面是好的东西希望可以分享给大家,另一方面希望自己能很好的吸收并转化成掌握的知识,所以有了这个系列的学习笔记,共勉,今天的你比昨天更博学 ...
- Python3并发写文件
使用python2在进行并发写的时候,发现文件会乱掉,就是某一行中间会插入其他行的内容. 但是在使用python3进行并发写的时候,无论是多进程,还是多线程,都没有出现这个问题,难道是python3的 ...
- 【React自制全家桶】二、分析React的虚拟DOM和Diff算法
一.React如何更新DOM内容: 1. 获取state 数据 2. 获取JSX模版 3. 通过数据 +模版结合,生成真实的DOM, 来显示,以下行代码为例(简称代码1) <div id= ...
- Android ADT安装与卸载
Android ADT安装 Eclipse 版本: Eclipse Java EE IDE for Web Developers. Version: Kepler Release Build id: ...
- axios的中文使用文档
axios 基于promise用于浏览器和node.js的http客户端 原文链接 lewis1990@amoy 特点 支持浏览器和node.js 支持promise 能拦截请求和响应 能转换请求和响 ...
- Python学习小技巧之列表项的排序
Python学习小技巧之列表项的排序 本文介绍的是关于Python列表项排序的相关内容,分享出来供大家参考学习,下面来看看详细的介绍: 典型代码1: data_list = [6, 9, 1, ...
- Day3 && Day4
本章内容对我来说真的是学的稀里糊涂的,除了前两题吭哧吭哧独立完成,第三题参考了别人的思路外,其余题目均是现学现卖,有点迷啊.所以写这篇博客的目的是先记录下聚聚们对本章内容相关重点的要求,并搜集一些相关 ...
- document.documentElement 和 document.body
MDN : The Document.documentElement read-only property returns the Element that is the root element o ...
- 开发单体web shop] 6. 商品分类和轮播广告展示
目录 商品分类&轮播广告 商品分类|ProductCategory 需求分析 开发梳理 编码实现 轮播广告|SlideAD 需求分析 开发梳理 编码实现 福利讲解 源码下载 下节预告 商品分类 ...
- 【POJ - 3009】Curling 2.0 (dfs+回溯)
-->Curling 2.0 直接上中文 Descriptions: 今年的奥运会之后,在行星mm-21上冰壶越来越受欢迎.但是规则和我们的有点不同.这个游戏是在一个冰游戏板上玩的,上面有一个正 ...