Luogu4755 Beautiful Pair 最值分治、主席树
整天做一些模板题感觉药丸
设\(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 最值分治、主席树的更多相关文章
- [luogu4755]Beautiful Pair
[luogu4755]Beautiful Pair luogu 第一次写最大值分治感觉有点丑 每次找到最大值mid,扫小的一边,主席树查大的一边小于等于\(\frac{a[mid]}{a[i]}\)的 ...
- P4755 Beautiful Pair (分治 + 主席树)
题意:1e5的数组 计算有多少对 ai * aj <= max(ai ai+1...aj-1 aj) 题解:在处理这种涉及到区间极值的题时 好像是个套路分治 从级值中间分成两个区间 从区间短的那 ...
- PAT天梯赛练习题 L3-002. 堆栈(线段树查询第K大值或主席树)
L3-002. 堆栈 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 大家都知道“堆栈”是一种“先进后出”的线性结构,基本操作有 ...
- BZOJ 1935 Tree 园丁的烦恼 CDQ分治/主席树
CDQ分治版本 我们把询问拆成四个前缀和,也就是二维前缀和的表达式, 我们把所有操作放入一个序列中 操作1代表在x,y出现一个树 操作2代表加上在x,y内部树的个数 操作3代表减去在x,y内部树的个数 ...
- LOJ#3097 [SNOI2019]通信 最小费用最大流+cdq分治/主席树/分块优化建图
瞎扯 我们网络流模拟赛(其实是数据结构模拟赛)的T2. 考场上写主席树写自闭了,直接交了\(80pts\)的暴力,考完出来突然发现: woc这个题一个cdq几行就搞定了! 题意简述 有\(n\)个哨站 ...
- [IOI2014]holiday假期(分治+主席树)
题目描述 健佳正在制定下个假期去台湾的游玩计划.在这个假期,健佳将会在城市之间奔波,并且参观这些城市的景点.在台湾共有n个城市,它们全部位于一条高速公路上.这些城市连续地编号为0到n-1.对于城市i( ...
- [BZOJ4367][IOI2014]Holiday(决策单调性+分治+主席树)
4367: [IOI2014]holiday假期 Time Limit: 20 Sec Memory Limit: 64 MBSubmit: 421 Solved: 128[Submit][Sta ...
- 【BZOJ4367】[IOI2014]holiday假期 分治+主席树
[BZOJ4367][IOI2014]holiday假期 Description 健佳正在制定下个假期去台湾的游玩计划.在这个假期,健佳将会在城市之间奔波,并且参观这些城市的景点.在台湾共有n个城市, ...
- 【题解】P4755 Beautiful Pair(启发式合并的思路+分治=启发式分治)
[题解]P4755 Beautiful Pair upd: 之前一个first second烦了,现在AC了 由于之前是直接抄std写的,所以没有什么心得体会,今天自己写写发现 不知道为啥\(90\) ...
随机推荐
- Android Studio 1.1.0 比较有用的快捷键
格式化代码:Ctrl + Alt + L清除无效包引用 Alt + Ctrl + O折叠展开代码块 Ctrl + Plus/Minus折叠展开全部代码块 Ctrl + Shift + Plus,Min ...
- JavaScript 脚本运行方式
引用外部脚本文件 <script src="/path/to/example.js"></script> 页面内联式 <script> aler ...
- dogse入门指南
dogse入门指南 Dogse作为游戏服务端引擎,目前只包含游戏服务端的核心部分,但这也是最核心的部分.它全部使用.net c#开发,充分兼顾了程序性能与代码编写的准确性与易用性,再加上以vs作为开发 ...
- C# 在PDF中绘制动态图章
我们知道,动态图章,因图章中的时间.日期可以动态的生成,因而具有较强的时效性.在本篇文章中将介绍通过C#编程在PDF中绘制动态图章的方法,该方法可自动获取当前系统登录用户名.日期及时间信息并生成图章. ...
- Oracle day03 连表查询
为什么要表连接进行查询? 查询部门名称为SALES的员工信息 如何进行表的连接查询? 两种方式:Sql 1992 和sql1999 sql1992sql分类 1.笛卡尔积 (表乘表) 2. ...
- PHP代码片段
将数组拼接为 table 标签字符串 <?php //判断是否是图片 function isImage($string){ $isImage = false; $pics = ['.png', ...
- Djiango初识
加载静态文件 在一个网页中,不仅仅只有一个 html 骨架,还需要 css 样式文件, js 执行文件以及一些图片 等.因此在 DTL 中加载静态文件是一个必须要解决的问题.在 DTL 中,使用 st ...
- Sublime 无法安装插件的解决办法
1,打开命令面板 Ctrl + Shift + P 输入:pi 回车 按回车后,出现异常如下图: 解决办法: 1,点击Preferences----Brows Packages ---会到安装目录 ...
- 好吧,CSS3 3D transform变换,不过如此!——张鑫旭
一.写在前面的秋裤 早在去年的去年,我就大肆介绍了2D transform相关内容.看过海贼王的都知道,带D的家伙都不是好惹的,2D我辈尚可以应付,3D的话,呵呵,估计我等早就在千里之外被其霸气震晕了 ...
- PhpStorm 运行出现502 Bad Gateway
打开PhpStorm,菜单栏File --> Settings... 一.点开Languages & Frameworks 选PHP PHP language level:选PHP版本, ...