传送门


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

设\(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. C++STL模板库适配器之queue队列

    目录 适配器之队列 一丶队列简介 二丶队列(queue)代码操作 1.常用方法 适配器之队列 一丶队列简介 队列是先进先出的数据结构. 在STL中使用 queue表示. 底层使用的是序列容器deque ...

  2. 容器平台自动化CI/CD流水线实践之一:环境概述

    一.架构图

  3. VS2015安装水晶报表

    最近在做一个打印功能,本来是不想用水晶报表的.想直接用微软原生的报表rdlc完成,但是整了一个上午老是打印乱码,且网上找资料找也找不出. 无奈放弃,然后就想到用水晶报表了,以前用过水晶报表,不过一直都 ...

  4. 痞子衡嵌入式:串口调试工具Jays-PyCOM诞生记(3)- 串口功能实现(pySerial)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是串口调试工具Jays-PyCOM诞生之串口功能实现. 串口调试助手是最核心的当然是串口数据收发与显示的功能,Jays-PyCOM借助的是 ...

  5. Python3+Selenium2完整的自动化测试实现之旅(七):完整的轻量级自动化框架实现

    一.前言 前面系列Python3+Selenium2自动化系列博文,陆陆续续总结了自动化环境最基础环境的搭建.IE和Chrome浏览器驱动配置.selenium下的webdriver模块提供的元素定位 ...

  6. 一统江湖的大前端(6)commander.js + inquirer.js——懒,才是第一生产力

    <一统江湖的大前端>系列是自己的前端学习笔记,旨在介绍javascript在非网页开发领域的应用案例和发现各类好玩的js库,不定期更新.如果你对前端的理解还是写写页面绑绑事件,那你真的是有 ...

  7. C# WebService创建与使用

    WebService现在虽然有更好的方式去替代它,但是它简单,开发成本低.很简单,对着本文一看就会 1.WebService的创建开发 2.WebService的发布测试 3.WebService的调 ...

  8. Linux 安装composer

    wget https://getcomposer.org/installer //下载一个脚本文件 php installer //php执行下这个php脚本(虚拟机我没装环境.以下截图有操作流程) ...

  9. PhpStudy升级MySQL5.7

    PhpStudy2017集成环境中的mysql数据库的版本默认是mysql5.5,下面是PhpStudy升级数据库到mysql5.7的方法: 1:备份当前数据库数据,可以导出数据库文件,作为备份,我这 ...

  10. Linux CentOS开机启动项设置命令:chkconfig

    1.开机启动+++crontab 定时执行(定时执行可参考:https://www.cnblogs.com/prefectjava/p/9399552.html)可实现自动化运行的目的,简化了维护人员 ...