首页 > 其他分享 >[题解] P4755 Beautiful Pair

[题解] P4755 Beautiful Pair

时间:2023-11-13 20:16:27浏览次数:44  
标签:Beautiful return int 题解 分治 mid num MAXN P4755

P4755 Beautiful Pair

给你一个长度为 \(n\) 的序列 \(a\),求有多少个区间 \([l, r]\) 满足 \(a_l \cdot a_r \le \max_{i = l}^r a_i\)。
\(n \le 10^5, a_i \le 10^9\)。

首先按最大值位置分治。记当前分治区间为 \([l, r]\),分治中心为 \(mid\)。那么我们现在要做的就是统计跨分治中心的二元组的答案。

不妨设 \(mid - l < r - mid\)。枚举 \([l, mid]\) 中的每个数 \(a_i\),这样问题就转化为了 \([mid, r]\) 中有多少个数小于等于 \(\frac{a_{mid}}{a_i}\),这个可以离线下来扫描线解决。

时间复杂度 \(O(n \log^2 n)\)。

constexpr int MAXN = 1e5 + 9, MAXLG = 17;
int n, a[MAXN];
vector<int> num, upd[MAXN];
pii st[MAXLG][MAXN];
vector<pair<int, int> > qry[MAXN];
ll ans = 0;

struct Fenwick {
	int n; vector<int> c;
	
	Fenwick(): n(0) { return; }
	Fenwick(int _n): n(_n), c(_n + 1) { return; }
	void Update(int x, int k) {
		for (; x <= n; x += x & -x) c[x] += k;
		return;
	}
	int Query(int x) {
		ll ans = 0;
		for (; x; x ^= x & -x) ans += c[x];
		return ans;
	}
	int Query(int l, int r) {
		return Query(r) - Query(l - 1);
	}
};

pii Query(int l, int r) {
	int k = __lg(r - l + 1);
	return max(st[k][l], st[k][r - (1 << k) + 1]);
}
void Solve(int l, int r) {
	if (l > r) return;
	int mid = Query(l, r).sec;
	if (mid - l < r - mid) {
		for (int i = l; i <= mid; i ++) {
			int x = num[a[mid]] / num[a[i]];
			if (x < num.front()) continue;
			x = upper_bound(num.begin(), num.end(), x) - num.begin() - 1;
			qry[x].emplace_back(mid, r);
		}
	} else {
		for (int i = mid; i <= r; i ++) {
			int x = num[a[mid]] / num[a[i]];
			if (x < num.front()) continue;
			x = upper_bound(num.begin(), num.end(), x) - num.begin() - 1;
			qry[x].emplace_back(l, mid);
		}
	}
	Solve(l, mid - 1), Solve(mid + 1, r);
	return;
}

void slv() {
	n = Read<int>();
	for (int i = 1; i <= n; i ++) num.emplace_back(a[i] = Read<int>());
	sort(num.begin(), num.end()), num.erase(unique(num.begin(), num.end()), num.end());
	for (int i = 1; i <= n; i ++) a[i] = lower_bound(num.begin(), num.end(), a[i]) - num.begin();
	for (int i = 1; i <= n; i ++) upd[a[i]].emplace_back(i);
	for (int i = 1; i <= n; i ++) st[0][i] = {a[i], i};
	for (int i = 1; i <= __lg(n); i ++) for (int j = 1; j + (1 << i) - 1 <= n; j ++)
		st[i][j] = max(st[i - 1][j], st[i - 1][j + (1 << i - 1)]);
	Solve(1, n);
	Fenwick tr(n);
	for (int i = 0; i < num.size(); i ++) {
		for (auto j : upd[i]) tr.Update(j, 1);
		for (auto [l, r] : qry[i]) ans += tr.Query(l, r);
	}
	Write(ans, '\n');
	return;
}

标签:Beautiful,return,int,题解,分治,mid,num,MAXN,P4755
From: https://www.cnblogs.com/definieren/p/17830026.html

相关文章

  • 【题解 P4062 & P8313】 Yazid 的新生舞会&Izbori
    [COCI2021-2022#4]Izbori题目描述Malnar先生正在竞选县长,这个县一共有\(n\)栋房屋,每栋房屋里都住着一位居民。Malnar先生知道,选举的赢家不一定是最好的候选人,而是在选举前举办的宴会最好的候选人。因此,在选举前几天,他将邀请第\(l\)至\(r(l\ler)\)栋房屋内居住的居民,为......
  • 【题解】CF1891E - Brukhovich and Exams
    【题解】CF1891E-BrukhovichandExamshttps://www.luogu.com.cn/problem/CF1891E我们考虑把区间分段:若两个相邻的数不互素,中间分开;若两个相邻的数中有且仅有一个\(1\),中间分开。那么我们得到了两种区间:全\(1\)区间与无\(1\)区间。若两个相邻数在同一区间内,那么就在区间......
  • [题解] CFgym101623F Factor-Free Tree
    Factor-FreeTree当一棵二叉树中的每个节点的权值都与它所有祖先的权值互质时,我们称它为factor-freetree。给你一棵按照中序遍历的顺序的权值序列\(a\),求这个序列是否对应这一棵factor-freetree。如果是就输出每个节点的父亲。\(n\le10^5,a_i\le10^7\)。考虑怎么......
  • SP2139题解
    思路这题数据范围小,暴力就可以了。首先我们用map来统计每个人的下标,用\(bk_{i,j}\)表示第\(i\)个人第\(j\)题是否知道答案。对于每次合作交流,暴力修改就可以了,先统计出两个人的下标,假设一个为\(x\),另一个为\(y\)。然后,如果\(bk_{x,i}\)和\(bk_{y,i}\)中(\(1\lei......
  • [ARC106E] Medals 题解
    题意有一个商店和\(N\)名员工,其中第\(i\)名员工在第\(1\simA_i\)天工作,在第\(A_i+1\sim2\timesA_i\)休息,接下来每\(A_i\)天改变一次状态。每一天你都可以选择一名来上班的员工并为其颁一个奖,求使得每名员工都获得至少\(K\)个奖的最小天数。\(1\leN\le......
  • [题解] CF1156E Special Segments of Permutation
    SpecialSegmentsofPermutation给你一个排列\(p\),求有多少个区间\([l,r]\)满足\(p_l+p_r=\max_{i\in[l,r]}p_i\)。\(n\le2\times10^5\)。按最大值分治,记当前的分治中心为\(mid\),分治区间为\([l,r]\)。然后需要计算跨分治中心的贡献。如果\(mid-l......
  • [题解]AT_abc328_f [ABC328F] Good Set Query
    思路带权并查集模板。如果对于一个三元组\((a,b,c)\)如果它能够添加到\(S\)中一定满足如下条件中的一条:\(X_a,X_b\)满足其中有一个是「不确定」的。在这里\(X_i\)「不确定」指\(X_i\)没有与其它的任意\(X_j\)有关系。\(X_a,X_b\)有间接或直接的关系,但是能计算......
  • CF300B Coach 题解
    闲话调了好一会,甚至还重构了一次代码才对,但是还是很喜欢并查集,并查集可爱捏。题意省流$n$个学生分成$3$人一组,要满足$m$个条件,每个条件给出两个数$x,y$,要求$x$和$y$必须在一个组里。正文要使学生三人一组,一眼使用并查集。首先考虑无解(输出$-1$)的情况:给出的限......
  • 【题解 P8476】 惊蛰
    「GLR-R3」惊蛰题目背景  「微雨众卉新,一雷惊蛰始」  中午,休息室,阿绫肩膀上。  “我有一个愿望,参加全国音乐祭,获奖,和阿绫一起,摆脱这训练的苦海。”  “为热爱而到来,为抽身而努力……吗”。  正午的阳光渗过窗帘,抚上困倦的人儿的脸颊。天依的左手悄悄搭上阿绫怀里......
  • NOJ题解
    NOJ题解30-40素数埃氏筛,欧拉筛都可可变参数累加/平均用给出的库函数即可基思数根据题意模拟#include<stdio.h>#definelllonglongllnum[102];inlineboolIsKeith(lln){inttot=0,t=0;lls=n;while(s){num[++tot]=s%10......