正解:最大值分治

解题报告:

传送门$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. @codeforces - 1221G@ Graph And Numbers

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定一个 n 点 m 边的无向图. 现在要求给每个点写上 0 或 ...

  2. @loj - 2288@「THUWC 2017」大葱的神力

    目录 @description@ @solution@ @data - 1@ @data - 2@ @data - 3@ @data - 4@ @data - 5@ @data - 6@ @data ...

  3. html实体字符转换成字符串

    function EntityToString(value) { let tag = document.createElement("div"); tag.innerHTML = ...

  4. LRJ-Example-06-13-Uva1103

    pic[][]数组存储每个点的值,0或1,输入时在原图的周围加了一圈0. color[][]数组存储每个点的color值,从1开始,dfs(row, col, c) 负责对每个点着色,连通在一起的连通 ...

  5. pip、conda 换国内源,大大提高下载速度

    https://www.jianshu.com/p/b2d53904dd37 源就是下载地址了,换到国内的源下载速度真的快了近10倍,这里都用了清华的源 pip 只要新建一个配置文件,写上路径就行了 ...

  6. H3C DCC拨号配置任务

  7. 2018-8-10-win10-uwp-读取保存WriteableBitmap-、BitmapImage

    title author date CreateTime categories win10 uwp 读取保存WriteableBitmap .BitmapImage lindexi 2018-08-1 ...

  8. Python--day65--模板语言之filter

    参考的原文链接:http://www.cnblogs.com/liwenzhou/p/7931828.html Filters(过滤器) 在Django的模板语言中,通过使用 过滤器 来改变变量的显示 ...

  9. H3C 建立邻接关系

  10. 分析JVM动态生成的类

    总结思考:让jvm创建动态类及其实例对象,需要给它提供哪些信息? 三个方面: 1.生成的类中有哪些方法,通过让其实现哪些接口的方式进行告知: 2.产生的类字节码必须有个一个关联的类加载器对象: 3.生 ...