[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.7.18 linux下ELK环境搭建
参考来自:Linux日志分析ELK环境搭建 另一篇博文:2017.7.18 windows下ELK环境搭建 0 版本说明 因为ELK从5.0开始只支持jdk 1.8,但是项目中使用的是JDK 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 ...
- 在MyEclipse上安装GIT插件EGit
MyEclipse2016 CI 下载地址:http://pan.baidu.com/s/1gfBw9Ab 1.“Help”->"Install from Site" 2.在 ...
- 关于web后门权限防删的一个新思路
见土司有一帖子 具体看下面连接 https://www.t00ls.net/thread-26444-1-2.html 这是php的 其实IIS也有类似的 这是MSF生成的一个ASPX执行shellc ...
- hdu5303(2015多校2)--Delicious Apples(贪心+枚举)
Delicious Apples Time Limit: 5000/3000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Other ...
- ubuntu+tomcat,多环境、自动化部署脚本,git+maven+tomcat+ubuntu
1.切换到/opt/code目录,没有利用mkdir code创建code目录,新建deploy.sh 脚本文件,内容如下 projectName=""; #默认tomcat目录 ...
- git个人使用总结(命令版)
一.基础命令 快照类操作:add.status.diff.commit.reset.rm.mv 分支类基本操作:branch.checkout.log.stash 分享及更新项目基本操作:pull.p ...
- Memcached的LRU和缓存命中率
缓存命中率 命中:直接从缓存中读取到想要的数据. 未中:缓存中没有想要的数据,还需要到数据库进行一次查询才能读取到想要的数据. 命中率越高,数据库查询的次数就越少. 读取缓存的速度远比数据库查询的速度 ...
- java中利用WeakHashMap实现缓存
简介 WeakHashMap是Java集合框架里的一员,从名字可以看出它是某种 Map.它的特殊之处在于 WeakHashMap 里的entry可能会被GC自动删除,即使程序员没有调用remove() ...
- 【Oracle】使用BBED跳过丢失的归档
在recover datafile的过程其中假设丢失了须要的归档将使得recover无法进行.使用bbed工具能够跳过丢失的归档进行recover datafile. 实验步骤例如以下: SYS@OR ...