正解:最大值分治

解题报告:

传送门$QwQ$

昂考虑如果已经钦定了点$x$是这个$max$了,然后现在要求有多少对$[l,r]$满足$a_x=max\left\{a_i\right\},i\in[l,r]$,且$a_l\cdot a_r\leq a_x$

现在枚举$l$,发现$r$就有一个范围了,就$a_r\leq \frac{a_x}{a_l}$,这个就可以用主席树维护下就成嘛$QwQ$(我开始想用树状数组的,,,然后想了下发现因为是分治所以每次树状数组都要重建复杂度是错的$kk$,所以还是去用主席树趴$QwQ$

所以就基本上能得出这题的基本思路了?首先找到区间最大值$x$,先分别求出$x$两侧的答案,然后统计跨过$x$的贡献.考虑枚举$l$,然后对于$r$就直接树状数组搞下就行.但是发现如果$l$中的点太多也不可,所以考虑枚举$size$较小的那一边.

这个的复杂度和启发式合并的复杂度是一样的,就$O(nlogn)$,然后加上树状数组的复杂度,总复杂度就两个$log$的

$over$?

#include<bits/stdc++.h>
using namespace std;
#define il inline
#define gc getchar()
#define mp make_pair
#define int long long
#define ri register int
#define rc register char
#define rb register bool
#define rp(i,x,y) for(ri i=x;i<=y;++i)
#define my(i,x,y) for(ri i=x;i>=y;--i)
#define lb(x) lower_bound(b+1,b+1+num,x)-b
#define ub(x) upper_bound(b+1,b+1+num,x)-b const int N=1e5+;
int n,a[N],b[N],st[][N],num,rt[N],nod_cnt,lg[N];
struct node{int num,ls,rs;}tr[N*]; il int read()
{
rc ch=gc;ri x=;rb y=;
while(ch!='-' && (ch>'' || ch<''))ch=gc;
if(ch=='-')ch=gc,y=;
while(ch>='' && ch<='')x=(x<<)+(x<<)+(ch^''),ch=gc;
return y?x:-x;
}
il int cmp(ri gd,ri gs){return a[gd]>=a[gs]?gd:gs;}
il void pre()
{
lg[]=-;rp(i,,n)st[][i]=i,lg[i]=lg[i>>]+;
rp(i,,lg[n])
rp(j,,n-(<<i)+)st[i][j]=cmp(st[i-][j],st[i-][j+(<<(i-))]);
}
il int ask(ri l,ri r){ri len=lg[r-l+];return cmp(st[len][l],st[len][r-(<<len)+]);}
int modify(ri nw,ri l,ri r,ri to)
{
ri x=++nod_cnt;tr[x]=tr[nw];++tr[x].num;if(l==r)return x;
ri mid=(l+r)>>;to<=mid?tr[x].ls=modify(tr[nw].ls,l,mid,to):tr[x].rs=modify(tr[nw].rs,mid+,r,to);
return x;
}
int query(ri nw,ri l,ri r,ri to)
{
if(r<=to)return tr[nw].num;
ri mid=(l+r)>>,ret=query(tr[nw].ls,l,mid,to);
if(mid<to)ret+=query(tr[nw].rs,mid+,r,to);
return ret;
}
int solv(ri l,ri r)
{
if(l>r)return ;
if(l==r)return b[a[l]]==;
ri mid=ask(l,r),sum=;sum+=solv(l,mid-);sum+=solv(mid+,r);//printf("l=%d r=%d sum=%d mid=%d solv(%d,%d),solv(%d,%d)\n",l,r,sum,mid,l,mid-1,mid+1,r);
ri tl=l,tr=mid,askl=mid,askr=r;if(mid-l+>r-mid)swap(tl,askl),swap(tr,askr);
//printf("tl=%d tr=%d askl=%d askr=%d\n",tl,tr,askl,askr);
rp(i,tl,tr)
{
ri lim=ub(b[a[mid]]/b[a[i]])-;if(lim)sum+=query(rt[askr],,num,lim)-query(rt[askl-],,num,lim);
}
//printf("l=%d r=%d sum=%d\n",l,r,sum);
return sum;
} signed main()
{
//freopen("4755.in","r",stdin);freopen("4755.out","w",stdout);
n=read();rp(i,,n)a[i]=b[i]=read();sort(b+,b++n);num=unique(b+,b++n)-b-;
rp(i,,n)a[i]=lb(a[i]),rt[i]=modify(rt[i-],,num,a[i]);
pre();printf("%lld\n",solv(,n));
return ;
}

洛谷$P4755\ Beautiful\ Pair$ 最大值分治的更多相关文章

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

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

  2. P4755 Beautiful Pair

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

  3. luogu P4755 Beautiful Pair

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

  4. 洛谷4755 Beautiful Pair (分治)

    题目描述 小D有个数列 \(a\),当一个数对 \((i,j)(i\le j)\) 满足\(a_i\)和\(a_j\)的积 不大于 \(a_i \cdots a_j\) 中的最大值时,小D认为这个数对 ...

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

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

  6. [luogu4755]Beautiful Pair

    [luogu4755]Beautiful Pair luogu 第一次写最大值分治感觉有点丑 每次找到最大值mid,扫小的一边,主席树查大的一边小于等于\(\frac{a[mid]}{a[i]}\)的 ...

  7. BZOJ3711 Druzyny 最大值分治、线段树

    传送门 被暴力包菜了,然而还不会卡-- 有一个很暴力的DP:设\(f_i\)表示给\(1\)到\(i\)分好组最多可以分多少组,转移枚举最后一个组.接下来考虑优化这个暴力. 考虑:对于每一个位置\(i ...

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

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

  9. P4755 Beautiful Pair (分治 + 主席树)

    题意:1e5的数组 计算有多少对 ai * aj <= max(ai ai+1...aj-1 aj) 题解:在处理这种涉及到区间极值的题时 好像是个套路分治 从级值中间分成两个区间 从区间短的那 ...

随机推荐

  1. POLARDB v2.0 技术解读

    点击观看“POLARDB 2.0 升级发布会”:https://yq.aliyun.com/live/1136 回顾POLARDB 1.0 POLARDB 1.0 主要的改进包括采用了计算存储分离的架 ...

  2. @codeforces - 455E@ Function

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 已知 a 序列,并给定以下关系: \[\begin{cases} ...

  3. NOIP2007 树网的核 && [BZOJ2282][Sdoi2011]消防

    NOIP2007 树网的核 树的直径的最长性是一个很有用的概念,可能对一些题都帮助. 树的直径给定一棵树,树中每条边都有一个权值,树中两点之间的距离定义为连接两点的路径边权之和.树中最远的两个节点之间 ...

  4. [C#] 如何分析stackoverflow等clr错误

    有时候由于无限递归调用等代码错误,w3wp.exe会报错退出,原因是clr.exe出错了. 这种错误比较难分析,因为C#代码抓不住StackOverflowException等异常. 处理方法是:生成 ...

  5. python-----堡垒机前戏paramiko模块及进阶

    堡垒机前戏 开发堡垒机之前,先来学习Python的paramiko模块,该模块机遇SSH用于连接远程服务器并执行相关操作 SSHClient 用于连接远程服务器并执行基本命令 基于用户名密码连接: i ...

  6. OpenStack Nova启动实例流程

    1.概述 启动一个新的实例,会涉及到OpenStack Nova中的多个组件: API服务器,接收用户端的请求,并且将其传递给云控制器. 云控制器,处理计算节点.网络控制器.API服务器和调度器之前的 ...

  7. Spring读取配置文件,地址问题,绝对路径,相对路径

    Spring在读取配置文件时,是相对于bin,或者WEB-INF的: “applicationContext.xml”就是找bin或WEB-INF及子文件夹下的文件: “/res/applicatio ...

  8. 1878: [SDOI2009]HH的项 莫队算法-离线查询区间内部不同数字的个数

    #include<iostream> #include<stdio.h> #include<string.h> #include<algorithm> ...

  9. POJ2752 Seek the Name, Seek the Fame 题解 KMP算法

    题目链接:http://poj.org/problem?id=2752 题目大意:给你一个字符串 \(S\) ,如果它的一个前缀同时也是它的后缀,则输出这个前缀(后缀)的长度. 题目分析:next函数 ...

  10. poj 3384 Feng Shui (Half Plane Intersection)

    3384 -- Feng Shui 构造半平面交,然后求凸包上最远点对. 这题的题意是给出一个凸多边形区域,要求在其中放置两个半径为r的圆(不能超出凸多边形区域),要求求出两个圆心,使得多边形中没有被 ...