传送门


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

设\(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_JUDGEfreopen("in","r",stdin);//freopen("out","w",stdout);
#endifN = 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;
}

转载于:https://www.cnblogs.com/Itst/p/10792371.html

Luogu4755 Beautiful Pair 最值分治、主席树相关推荐

  1. P4755 Beautiful Pair (数据结构+分治)

    题意: 小D有个数列a ,当一个数对(i,j)(i≤j)(i,j)(i\leq j)(i,j)(i≤j)满足 aia_iai​和 aj​a_j​aj​​ 的积不大于 ai,ai+1​,........ ...

  2. [决策单调性 分治 主席树] BZOJ 4367 [IOI2014]holiday假期

    比较显然的做法 枚举l,r 然后主席树 这题有很多单调性 可以利用 对一个确定的l 最优的r 是单调的 来分治 #include<cstdio> #include<cstdlib&g ...

  3. Codeforces Round #716 (Div. 2) D. Cut and Stick 主席树 + 思维

    传送门 文章目录 题意: 思路: 题意: 给你个长为nnn的数组aaa,定义好的区间为这个区间中每个数出现的次数≤⌈n2⌉\le \left \lceil \frac{n}{2} \right \rc ...

  4. array(2019CCPC网络预选赛 hdu6703主席树+set)主席树求大于等于k的最小值

    Problem Description You are given an array a1,a2,-,an(∀i∈[1,n],1≤ai≤n). Initially, each element of t ...

  5. HDU - 6621 K-th Closest Distance——主席树+二分

    [题目描述] HDU - 6621 K-th Closest Distance [题目分析] 因为看到第kkk大的要求,刚开始的时候一直都在想怎么运用第kkk大来解决问题,但是后来看其他人的博客才发现 ...

  6. Luogu 4755 Beautiful Pair

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

  7. [THUPC2017]天天爱射击 题解(主席树)

    传送门:cogs2897 在网上搜了一圈,只有可怜的一篇题解,是整体二分的.其实这题可以不用整体二分(我不会整体二分). 二分的思想是,对于每块木板,可以二分它被打碎的时间,然后用数据结构来check ...

  8. 洛谷 - P4755 Beautiful Pair(笛卡尔树+主席树)

    题目链接:点击查看 题目大意:给出一个长度为 n 的数列 a,现在一个数对 ( i , j ) 如果满足 a[ i ] * a[ j ] <=max( a[ i ] ~ a[ j ] ),则称其 ...

  9. 【UNR #6 C】稳健型选手(分治)(主席树)(二分)

    稳健型选手 题目链接:UNR #6 C 题目大意 有一排卡牌,然后每次询问一个区间,问先手最多的分数. 玩法是先手后手轮流选一张牌拿走,先手任选,后手一定会选最左边的. 然后分数是拿的牌的分数和. 思 ...

最新文章

  1. 转 Log4j.properties配置详解
  2. SpringBoot中使用FastJson解析Json数据
  3. PHP 常用函数及其它功能
  4. SAP Spartacus页面底部的Component请求
  5. php如何表格中的变为超链接,php中将网址转换为超链接的函数
  6. 通过关闭UseDNS和GSSAPIAuthentication选项加速SSH登录
  7. 远离复杂公式推导,直接解决共线性
  8. java 二进制置位,重置
  9. linux jenkins自动部署,【linux】【jenkins】自动化部署一 安装jenkins
  10. 表白神器(VBS编程)
  11. 获取网络时间(国家标准时间)
  12. 开源人物之九:赖霖枫
  13. java主色调_主色调
  14. 【DLL的函数】关于DLL的函数|_declspec(dllimport)
  15. 变分图自动编码器教程
  16. 问题“ConnectionString属性尚未初始化”之解决办法
  17. 解决无法打开B站网页问题
  18. [大数据计算基础] 大数据计算系统
  19. Dockers-搭建本地私有仓库
  20. SEC6 - MySQL 查询语句--------------进阶2:条件查询

热门文章

  1. ASP.NET企业开发框架IsLine FrameWork系列之四--DataProvider 数据访问(上)
  2. 漫步微积分三十——定积分的性质
  3. 牛津书虫系列_【SHARE】牛津书虫系列英文书
  4. python安装完后还需要装什么_初学 Python 需要安装哪些软件?
  5. 操作系统 ——进程的状态与转换
  6. 面试题 08.02. 迷路的机器人
  7. 去哪儿-12-city-search-logic
  8. Tensorflow 十六 用tf.keras函数重写Mnist识别
  9. Jetson TX2软件源更新
  10. c语言终极面试宝典 pdf,C语言终极面试--编程