[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的更多相关文章

  1. Luogu4755 Beautiful Pair 最值分治、主席树

    传送门 整天做一些模板题感觉药丸 设\(val_i\)表示第\(i\)个位置的值 看到区间最大值考虑最值分治.对于当前的区间\([l,r]\),找到区间最大值\(mid\),递归\([l,mid-1] ...

  2. 【题解】P4755 Beautiful Pair(启发式合并的思路+分治=启发式分治)

    [题解]P4755 Beautiful Pair upd: 之前一个first second烦了,现在AC了 由于之前是直接抄std写的,所以没有什么心得体会,今天自己写写发现 不知道为啥\(90\) ...

  3. 「LGR-049」洛谷7月月赛 D.Beautiful Pair

    「LGR-049」洛谷7月月赛 D.Beautiful Pair 题目大意 : 给出长度为 \(n\) 的序列,求满足 \(i \leq j\) 且 $a_i \times a_j \leq \max ...

  4. 洛谷 P4755 - Beautiful Pair(主席树+分治+启发式优化)

    题面传送门 wssb,我紫菜 看到这类与最大值统计有关的问题可以很自然地想到分治,考虑对 \([l,r]\) 进行分治,求出对于所有 \(l\le x\le y\le r\) 的点对 \((x,y)\ ...

  5. luoguP4755 Beautiful Pair

    https://www.luogu.org/problemnew/show/P4755 考虑分治,在 [l, r] 区间中用线段树找到最大的一个点,处理经过它的可行数对的个数,统计个数可以离线树状数组 ...

  6. Luogu 4755 Beautiful Pair

    分治 + 主席树. 设$solve(l, r)$表示当前处理到$[l, r]$区间的情况,我们可以找到$[l, r]$中最大的一个数的位置$mid$,然后扫一半区间计算一下这个区间的答案. 注意,这时 ...

  7. P4755 Beautiful Pair

    题目 洛谷 做法 \(i≤x≤j,a[i]<\frac{a[x]}{a[j]}\) 考虑\(a[x]\)的贡献,单调栈预处理\(L,R\)能作为最大值的区间 枚举一端点,仅需另一端点满足条件即可 ...

  8. luogu P4755 Beautiful Pair

    luogu 这题有坨区间最大值,考虑最值分治.分治时每次取出最大值,然后考虑统计跨过这个位置的区间答案,然后两边递归处理.如果之枚举左端点,因为最大值确定,右端点权值要满足\(a_r\le \frac ...

  9. 洛谷$P4755\ Beautiful\ Pair$ 最大值分治

    正解:最大值分治 解题报告: 传送门$QwQ$ 昂考虑如果已经钦定了点$x$是这个$max$了,然后现在要求有多少对$[l,r]$满足$a_x=max\left\{a_i\right\},i\in[l ...

随机推荐

  1. 2017.6.29 移除再导入maven module到IDEA中时提示: Unable to proceed. Nothing found to import.

    解决办法来自:https://stackoverflow.com/questions/18278016/re-importing-modules-into-intellij 场景: 将其中一个modu ...

  2. iOS 引入外部字体 otf/ttf/ttc

    1.首先下载到字体的otf文件(Mac电脑下搜索字体册) 2.将字体文件拖到项目工程下 3.plist设置 Fonts provided by application 属性 4.代码中使用[UIFon ...

  3. python pip install error

    使用pip install的时候报错 解决方法是使用如下的命令进行安装 python -m pip install sqlalchemy 升级pip的命令python2 -m pip install ...

  4. ddmrp

    DDMRP 特点 在供应链加入 mts 缓冲,解耦 lead time, 缩小 bullwhip 效应,最小化库存 buffer动态调整 buffer 分3个颜色共 4个区域[zone],为 gree ...

  5. Ubuntu14.04下MySQL的安装与卸载

    转载自:https://www.2cto.com/os/201408/329502.html 安装MysQL 执行以下命令:sudo apt-get install mysql-server 2. 继 ...

  6. mongoDB 高级查询语法

    http://www.cnblogs.com/ITAres/articles/2084794.html本文参考自官方的手册:http://www.mongodb.org/display/DOCS/Ad ...

  7. block知识点

    1.block引用局部变量的时候,该变量会作为常量编码到block中,在block中不能被修改. 2.使用 __block修饰的局部变量,不会作为常量被编码到block中,故而在block中可以被修改 ...

  8. UITextView被键盘遮挡的处理

    这个应该是一个通用的任务了吧,键盘弹出来的时候,UITextView(或者UITextField)会被遮挡. 解决的办法就不是很能通用了. 1. 如果有UIScrollView做父view的话只需要滚 ...

  9. java中不能用小数点(.)来做分隔符

    split()括号里是一个String的参数,所以一定要符合这种:split(".")形式,即点'.'要用双引号""括起来"."在java中 ...

  10. PHP设置会话(Session)超时过期时间实现登录时间限制

    最近某个PHP项目用到了限制登录时间的功能,比如用户登录系统60分钟后如果没有操作就自动退出,我搜索了网络收集了有以下方法可供参考. 第一种方法即设置php.ini配置文件,设置session.gc_ ...