[luogu4755]Beautiful Pair
[luogu4755]Beautiful Pair
luogu
第一次写最大值分治感觉有点丑
每次找到最大值mid,扫小的一边,主席树查大的一边小于等于\(\frac{a[mid]}{a[i]}\)的个数
复杂度\(O(nlog^2n)\)
md主席树空间又挂了几次(修改次数*log值域)
#define ll long long
#include<bits/stdc++.h>
using namespace std;
const int _=1e5+5;
int re(){
int x=0,w=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
return x*w;
}
ll ans;
int n,m,tot;
int a[_],rt[_],lg[_],s[_*33],ls[_*33],rs[_*33],f[20][_];
void upd(int&x,int l,int r,int k){
s[++tot]=s[x]+1;ls[tot]=ls[x];rs[tot]=rs[x];
x=tot;if(l==r)return;int mid=l+r>>1;
if(k<=mid)upd(ls[x],l,mid,k);
else upd(rs[x],mid+1,r,k);
}
int qsum(int x,int l,int r,int ql,int qr){
if(ql<=l&&r<=qr)return s[x];
int mid=l+r>>1,res=0;
if(ql<=mid)res=qsum(ls[x],l,mid,ql,qr);
if(qr>mid)res+=qsum(rs[x],mid+1,r,ql,qr);
return res;
}
int qmax(int l,int r){
int k=lg[r-l+1],x=f[k][l],y=f[k][r-(1<<k)+1];
return a[x]>a[y]?x:y;
}
void solve(int l,int r){
int mid=qmax(l,r);
if(mid-l<r-mid){
for(int i=l;i<mid;i++){
ans+=qsum(rt[r],1,m,1,a[mid]/a[i]);
ans-=qsum(rt[mid-1],1,m,1,a[mid]/a[i]);
}
ans+=qsum(rt[r],1,m,1,1);
ans-=qsum(rt[mid],1,m,1,1);
}
else{
for(int i=mid+1;i<=r;i++){
ans+=qsum(rt[mid],1,m,1,a[mid]/a[i]);
ans-=qsum(rt[l-1],1,m,1,a[mid]/a[i]);
}
ans+=qsum(rt[mid-1],1,m,1,1);
ans-=qsum(rt[l-1],1,m,1,1);
}
if(l<mid-1)solve(l,mid-1);
if(mid+1<r)solve(mid+1,r);
}
int main(){
n=re();m=1e9;
for(int i=1;i<=n;i++)a[i]=re();
for(int i=2;i<=n;i++)lg[i]=lg[i>>1]+1;
for(int i=1;i<=n;i++){
ans+=(a[i]==1);
rt[i]=rt[i-1];f[0][i]=i;
upd(rt[i],1,m,a[i]);
}
for(int i=1;i<=lg[n];i++)
for(int j=1;j+(1<<i)-1<=n;j++){
int x=f[i-1][j],y=f[i-1][j+(1<<(i-1))];
f[i][j]=a[x]>a[y]?x:y;
}
solve(1,n);
printf("%lld\n",ans);
return 0;
}
[luogu4755]Beautiful Pair的更多相关文章
- Luogu4755 Beautiful Pair 最值分治、主席树
传送门 整天做一些模板题感觉药丸 设\(val_i\)表示第\(i\)个位置的值 看到区间最大值考虑最值分治.对于当前的区间\([l,r]\),找到区间最大值\(mid\),递归\([l,mid-1] ...
- 【题解】P4755 Beautiful Pair(启发式合并的思路+分治=启发式分治)
[题解]P4755 Beautiful Pair upd: 之前一个first second烦了,现在AC了 由于之前是直接抄std写的,所以没有什么心得体会,今天自己写写发现 不知道为啥\(90\) ...
- 「LGR-049」洛谷7月月赛 D.Beautiful Pair
「LGR-049」洛谷7月月赛 D.Beautiful Pair 题目大意 : 给出长度为 \(n\) 的序列,求满足 \(i \leq j\) 且 $a_i \times a_j \leq \max ...
- 洛谷 P4755 - Beautiful Pair(主席树+分治+启发式优化)
题面传送门 wssb,我紫菜 看到这类与最大值统计有关的问题可以很自然地想到分治,考虑对 \([l,r]\) 进行分治,求出对于所有 \(l\le x\le y\le r\) 的点对 \((x,y)\ ...
- luoguP4755 Beautiful Pair
https://www.luogu.org/problemnew/show/P4755 考虑分治,在 [l, r] 区间中用线段树找到最大的一个点,处理经过它的可行数对的个数,统计个数可以离线树状数组 ...
- 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\)能作为最大值的区间 枚举一端点,仅需另一端点满足条件即可 ...
- luogu P4755 Beautiful Pair
luogu 这题有坨区间最大值,考虑最值分治.分治时每次取出最大值,然后考虑统计跨过这个位置的区间答案,然后两边递归处理.如果之枚举左端点,因为最大值确定,右端点权值要满足\(a_r\le \frac ...
- 洛谷$P4755\ Beautiful\ Pair$ 最大值分治
正解:最大值分治 解题报告: 传送门$QwQ$ 昂考虑如果已经钦定了点$x$是这个$max$了,然后现在要求有多少对$[l,r]$满足$a_x=max\left\{a_i\right\},i\in[l ...
随机推荐
- 2017.4.28 SSM框架搭建与配置
1.项目结构 2.配置文件 对配置文件进行总结: pom.xml web.xml -> 配置web相关 -> 读取application*.xml 5 -> 读取logback.xm ...
- P6 EPPM 安装和配置指南
In This Section Installation and Configuration Guide Manual Installation Guides P6 Professional Inst ...
- HTML5 Canvas 六角光阑动态效果
光阑是光具组件中光学元件的边缘.框架或特别设置的带孔屏障,本人实现了结构比较简单的六角光阑,效果有点像宇航员在徐徐张开的飞船舷窗中看到逐渐完整的地球,下面四张图可以感受一下. 当然看动态效果才能真正体 ...
- 打造你的前端神器-webstorm11
说起前端编辑器,用过dw,sublime,hbuilder,webstorm也不陌生,之前的版本8有用过一下,但是觉得比sublime重量太多,但是随着后来用node的开始,发现需要打造个web前端神 ...
- 《学习bash》笔记--进程处理
1.进程ID和作业编号 当通过附加&号后执行命令时.shell会响应例如以下: $ ls & [1] 3318 当中[1]是作业号,3318是进程号. 一个后台进程完毕时.shell ...
- NSDate 类的总结,全面基础
<span style="font-size:24px;"><span style="font-size:18px;">//1.创建日期 ...
- springMVC 前后台日期格式传值解决方式之二(共二) @InitBinder的使用
关于springmvc日期问题的解决方式 除了本博客的[springMVC 前后台日期格式传值解决方式之 @DateTimeFormat的使用和配置]一文, 还有如下这种方式: 在Controller ...
- Nginx 限制单个IP的并发连接数及对每个连接速度(限速)
使用Nginx限制单个IP的并发连接数能够减少一些采集程序或者DDOS的攻击. 再lnmp的nginx配置中已经添加了部分代码,但是是注释掉的,可以编辑/usr/local/nginx/conf/ng ...
- 基于React的PC网站前端架构分析
代码地址如下:http://www.demodashi.com/demo/12252.html 本文适合对象 有过一定开发经验的初级前端工程师: 有过完整项目的开发经验,不论大小: 对node有所了解 ...
- AVCaptureSession
AVCaptureSession用来控制来自一个输入设备(AVCaptureDeviceInput)的声音和视频,流入一个输出缓冲区(AVCaptureOutput)的过程. 建立一个AVCaptur ...