传送门


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

设\(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. [三] java虚拟机 JVM字节码 指令集 bytecode 操作码 指令分类用法 助记符

    说明,本文的目的在于从宏观逻辑上介绍清楚绝大多数的字节码指令的含义以及分类 只要认真阅读本文必然能够对字节码指令集有所了解 如果需要了解清楚每一个指令的具体详尽用法,请参阅虚拟机规范 指令简介 计算机 ...

  2. k8s运行容器之deployment(三)--技术流ken

    deployment 我们已经知道k8s是通过各种controller来管理pod的生命周期.为了满足不同业务场景,k8s开发了Deployment.ReplicaSet.DaemonSet.Stat ...

  3. 第9章 使用客户端凭据保护API - Identity Server 4 中文文档(v1.0.0)

    快速入门介绍了使用IdentityServer保护API的最基本方案. 我们将定义一个API和一个想要访问它的客户端. 客户端将通过提供ClientCredentials在IdentityServer ...

  4. List<T>常用操作函数

    1.Add():添加单个元素2.AddRange():添加一个集合4.Insert():插入一个元素5.InsertRange():插入一个集合6.Remove():移除指定的元素7.RemoveAt ...

  5. C# WebService创建与使用

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

  6. PHP中private、public、protected的区别详解

    先简单粗俗的描述下:public 表示全局,类内部外部子类都可以访问:private表示私有的,只有本类内部可以使用:protected表示受保护的,只有本类或子类或父类中可以访问: 再啰嗦的解释下: ...

  7. 做一个开源的小程序登录模块组件(token)

    先了解下SSO 对于单点登陆浅显一点的说就是两种,一种web端的基于Cookie.另一种是跨端的基于Token,一般想要做的都优先做Token吧,个人建议,因为后期扩展也方便哦. 小程序也是呢,做成t ...

  8. Ajax请求中的async:false/true(同步/异步)的作用

    async. 默认是true,即为异步方式,$.Ajax执行后,会继续执行ajax后面的脚本,直到服务器端返回数据后,触发$.Ajax里的success方法,这时候执行的是两个线程.若要将其设置为fa ...

  9. Can't create/write to file '/tmp/MLjnvU95' (Errcode: 13 - Permission denied)

    今天一个同事反馈往一个MySQL数据库导入数据时,报"ERROR 1 (HY000): Can't create/write to file '/tmp/MLjnvU95' (Errcode ...

  10. [翻译]:MySQL Error: Too many connections

    翻译:MySQL Error: Too many connections   前言: 本文是对Muhammad Irfan的这篇博客MySQL Error: Too many connections的 ...