传送门


整天做一些模板题感觉药丸

设\(val_i\)表示第\(i\)个位置的值

看到区间最大值考虑最值分治。对于当前的区间\([l,r]\),找到区间最大值\(mid\),递归\([l,mid-1]\)和\([mid+1,r]\),然后考虑pair\((i,j)(i \in [l,mid] , r \in [mid,r])\)的贡献。

扫\([l,mid]\)和\([mid,r]\)中较短的一段区间,那么对于扫到的一个位置\(i\),它的贡献就是另一段区间中值小于等于\(\lfloor \frac{val_{mid}}{val_i} \rfloor\)的位置的数量,使用主席树维护即可。

#include<bits/stdc++.h>
//this code is written by Itst
using namespace std; int read(){
int a = 0; char c = getchar();
while(!isdigit(c)) c = getchar();
while(isdigit(c)){
a = a * 10 + c - 48;
c = getchar();
}
return a;
} #define ll long long
#define lb lower_bound
#define ub upper_bound
const int _ = 1e5 + 7;
namespace segTree{
int lch[_ * 20] , rch[_ * 20] , sum[_ * 20] , cntN; #define mid ((l + r) >> 1) int modify(int x , int l , int r , int tar){
int t = ++cntN;
sum[t] = sum[x] + 1; lch[t] = lch[x]; rch[t] = rch[x];
if(l == r) return t;
if(mid >= tar) lch[t] = modify(lch[t] , l , mid , tar);
else rch[t] = modify(rch[t] , mid + 1 , r , tar);
return t;
} int query(int x , int l , int r , int R){
if(r <= R) return sum[x];
int sum = query(lch[x] , l , mid , R);
if(mid < R) sum += query(rch[x] , mid + 1 , r , R);
return sum;
}
}
int rt[_] , val[_] , lsh[_] , ST[21][_] , logg2[_] , N , cntL; int cmp(int a , int b){return val[a] > val[b] ? a : b;} void init(){
logg2[0] = -1;
for(int i = 1 ; i <= N ; ++i){
ST[0][i] = i;
logg2[i] = logg2[i >> 1] + 1;
}
for(int i = 1 ; 1 << i <= N ; ++i)
for(int j = 1 ; j + (1 << i) - 1 <= N ; ++j)
ST[i][j] = cmp(ST[i - 1][j] , ST[i - 1][j + (1 << (i - 1))]);
} int qST(int l , int r){
int t = logg2[r - l + 1];
return cmp(ST[t][l] , ST[t][r - (1 << t) + 1]);
} ll solve(int l , int r){
if(l > r) return 0;
if(l == r) return lsh[val[l]] == 1 ? 1 : 0;
int Mid = qST(l , r) , w = lsh[val[Mid]];
ll sum = solve(l , Mid - 1) + solve(Mid + 1 , r);
int L = l , R = Mid , rgeL = Mid , rgeR = r;
if(Mid - l > r - Mid){
swap(rgeL , L); swap(rgeR , R);
}
while(L <= R){
int num = ub(lsh + 1 , lsh + cntL , w / lsh[val[L]]) - lsh - 1;
if(num)
sum += segTree::query(rt[rgeR] , 1 , cntL , num) - segTree::query(rt[rgeL - 1] , 1 , cntL , num);
++L;
}
return sum;
} int main(){
#ifndef ONLINE_JUDGE
freopen("in","r",stdin);
//freopen("out","w",stdout);
#endif
N = read();
for(int i = 1 ; i <= N ; ++i)
val[i] = lsh[i] = read();
sort(lsh + 1 , lsh + N + 1);
cntL = unique(lsh + 1 , lsh + N + 1) - lsh;
for(int i = 1 ; i <= N ; ++i){
val[i] = lb(lsh + 1 , lsh + cntL , val[i]) - lsh;
rt[i] = segTree::modify(rt[i - 1] , 1 , cntL , val[i]);
}
init();
cout << solve(1 , N);
return 0;
}

Luogu4755 Beautiful Pair 最值分治、主席树的更多相关文章

  1. [luogu4755]Beautiful Pair

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

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

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

  3. PAT天梯赛练习题 L3-002. 堆栈(线段树查询第K大值或主席树)

    L3-002. 堆栈 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 大家都知道“堆栈”是一种“先进后出”的线性结构,基本操作有 ...

  4. BZOJ 1935 Tree 园丁的烦恼 CDQ分治/主席树

    CDQ分治版本 我们把询问拆成四个前缀和,也就是二维前缀和的表达式, 我们把所有操作放入一个序列中 操作1代表在x,y出现一个树 操作2代表加上在x,y内部树的个数 操作3代表减去在x,y内部树的个数 ...

  5. LOJ#3097 [SNOI2019]通信 最小费用最大流+cdq分治/主席树/分块优化建图

    瞎扯 我们网络流模拟赛(其实是数据结构模拟赛)的T2. 考场上写主席树写自闭了,直接交了\(80pts\)的暴力,考完出来突然发现: woc这个题一个cdq几行就搞定了! 题意简述 有\(n\)个哨站 ...

  6. [IOI2014]holiday假期(分治+主席树)

    题目描述 健佳正在制定下个假期去台湾的游玩计划.在这个假期,健佳将会在城市之间奔波,并且参观这些城市的景点.在台湾共有n个城市,它们全部位于一条高速公路上.这些城市连续地编号为0到n-1.对于城市i( ...

  7. [BZOJ4367][IOI2014]Holiday(决策单调性+分治+主席树)

    4367: [IOI2014]holiday假期 Time Limit: 20 Sec  Memory Limit: 64 MBSubmit: 421  Solved: 128[Submit][Sta ...

  8. 【BZOJ4367】[IOI2014]holiday假期 分治+主席树

    [BZOJ4367][IOI2014]holiday假期 Description 健佳正在制定下个假期去台湾的游玩计划.在这个假期,健佳将会在城市之间奔波,并且参观这些城市的景点.在台湾共有n个城市, ...

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

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

随机推荐

  1. 手把手教您将 libreoffice 移植到函数计算平台

    LibreOffice 是由文档基金会开发的自由及开放源代码的办公室套件.LibreOffice 套件包含文字处理器.电子表格.演示文稿程序.矢量图形编辑器和图表工具.数据库管理程序及创建和编辑数学公 ...

  2. HTTP与HTTPS的理解

    最近一直也在面试的过程中,可能由于各个方面的问题,导致没有时间抽出更新博客,今天开始陆续更新!!!以后自己的博客,会向React Native,swift ,以及H5延展,成为一个全栈的技术人员.本篇 ...

  3. DSAPI多功能组件编程应用-网络相关(下)

    [DSAPI.DLL下载地址] 在本篇,我将重点介绍DSAPI.DLL中Socket编程的使用.众所周知,Socket用起来不难,但是写起来麻烦.我对Socket进行了封装,进行了高度简化.下面我将通 ...

  4. response.redirect 与location.href 的区别

    最近做项目时发现,先弹出提示框,再跳转页面 这样写:Jscript.Alert("你好,Hello!"); Response.Redirect("/index.aspx& ...

  5. Docker 更新镜像

    docker镜像如下: 今天在运行的容器内使用 apt-get update 命令进行更新时,发下很多404错误. Err http://archive.ubuntu.com wily-updates ...

  6. OO第一单元作业总结

    oo第一单元的作业是对多项式的求导.下面就是对三次作业分别进行分析. 第一次作业 分析 第一次作业相对来讲比较简单,甚至不用面向对象的思想都能十分轻松的完成(实际上自己就没有使用),包含的内容只有常数 ...

  7. Fundebug发布Vue插件,简化BUG监控接入代码

    摘要: 代码越短越好! 我们发布了fundebug-vue插件,可以简化Vue框架接入Fundebug的代码. Vue如何接入Fundebug 1. 安装fundebug-javascript与fun ...

  8. 学习前端笔记1(HTML)

    (注:此文是在看过许多学习资料和视频之后,加上自身理解拼凑而成,仅作学习之用.若有版权问题,麻烦及时联系) 标准页面结构: HTML发展历史:  注:每一种HTML需要有对应的doctype声明. H ...

  9. REST风格下如何放行静态资源

    在配置DispatcherServlet(前端控制器)时,如果把拦截路径配置成rest风格(即斜杠/),则会将静态资源也一并拦截(比如.css .js ,jpg)为了避免这个情况,可以把拦截路径设置成 ...

  10. ios手机录屏软件哪个好

    苹果手机中的airplay镜像,是苹果手机系统的一大特色,可以轻松把手机屏幕投射电脑,这个功能使苹果手机相较安卓手机投屏会更加轻松,那么如何实现苹果手机投射电脑屏幕?下面小编便来分享ios手机录屏软件 ...