首页 > 其他分享 >GYM102596L Yosupo's Algorithm【分治,支配对】

GYM102596L Yosupo's Algorithm【分治,支配对】

时间:2024-01-20 11:22:09浏览次数:27  
标签:tmp emplace Algorithm int auto back tq Yosupo GYM102596L

给定平面上 \(2n\) 个点,每个点有坐标 \((x_i,y_i)\),权值 \(w_i\) 及颜色 \(c_i\)。

所有点满足:若 \(c_i=0\),则 \(x_i <0\);若 \(c_i=1\),则 \(x_i > 0\)。

\(q\) 次查询,每次给定 \(L_i,R_i\),你需要选择两个点 \(i,j\) 满足如下条件:

  • \(c_i= 0,c_j=1\)。
  • \(x_i < L,x_j > R\) 或 \(x_i > L,x_j < R\)。
  • \(y_i < y_j\)。

求 \(w_i + w_j\) 的最大值。

\(1 \le n \le 10^5\),\(1 \le q \le 5 \times 10^5\),\(x_i,L_i,R_i\) 互不相同,\(y_i\) 互不相同。


注意到查询只关于 \(x\),感觉 \(x\) 和 \(y\) 两维好像相对独立,我们考虑先处理 \(y\) 的限制找到所有可能对答案有贡献的点对,那么查询就只需要扫描线树状数组。

直接枚举,点对的数量会达到 \(\mathcal{O}(n^2)\) 级别,不可接受。考虑对 \(y\) 分治,注意到对于当前层,分类讨论一下可以发现,最优的点对一定包含两种颜色的点的最大 \(w_i\) 中的至少一个,因此我们可以只考虑总共 \(\mathcal{O}(n\log n)\) 个点对。这样总时间复杂度就是 \(\mathcal{O}(n \log^2 n + q\log n)\) 的了。

code
#include <bits/stdc++.h>
#define all(x) x.begin(), x.end()
typedef long long LL;
using namespace std;
constexpr int N = 1e6 + 5;
void chkmx(int &x, int y) {
	x = x > y ? x : y;
}
struct info {
	int x, y, v, c;
	bool operator < (const info &p) const {
		return y < p.y;
	}
} p[N * 2];
struct qu {
	int l, r, v;
	bool operator < (const qu &p) const {
		return l < p.l;
	}
} f[N], g[N];
int n, q, m, cp, ans[N];
vector <qu> ad;
struct BIT1 { // prefix max 
	int c[N << 2];
	void mdf(int x, int v) {
		for (int i = x; i <= m; i += i & -i) chkmx(c[i], v);
	}
	int qry(int x) {
		int res = 0;
		for (int i = x; i; i -= i & -i) chkmx(res, c[i]);
		return res;
	}
} bit1;
struct BIT2 { // suffix max
	int c[N << 2];
	void mdf(int x, int v) {
//		cerr << "mdf " << x << " " << v << "\n"; 
		for (int i = x; i; i -= i & -i) chkmx(c[i], v);
	}
	int qry(int x) {
		int res = 0;
		for (int i = x; i <= m; i += i & -i) chkmx(res, c[i]);
		return res;
	}
} bit2;
void solve(int l, int r) {
	if (l == r) return;
	vector <info> tp, tq;
	int mid = l + r >> 1;
//	cerr << "[" << l << ", " << mid << "], [" << mid + 1 << ", " << r << "]\n"; 
	for (int i = l; i <= mid; i++) {
		if (p[i].c == 0) tp.emplace_back(p[i]);
	}
	for (int i = mid + 1; i <= r; i++) {
		if (p[i].c == 1) tq.emplace_back(p[i]);
	}
	if (tp.empty() || tq.empty()) goto skip;
	sort(all(tp), [&](info x, info y) {
		return x.x > y.x;
	});
	sort(all(tq), [&](info x, info y) {
		return x.x < y.x;
	});
//	cerr << "[" << l << ", " << r << "]\n";
//	for (auto it : tp) cerr << it.x << " " << it.y << " p\n";
//	for (auto it : tq) cerr << it.x << " " << it.y << " q\n";
//	vector <info> tmp;
//	for (auto it : tp) {
//		if (tmp.empty()) tmp.emplace_back(it);
//		else {
//			if (it.v >= tmp.back().v) 
//				tmp.emplace_back(it);
//		}
//	}
//	swap(tmp, tp);
//	tmp.clear();
//	for (auto it : tq) {
//		if (tmp.empty()) tmp.emplace_back(it);
//		else {
//			if (it.v >= tmp.back().v)
//				tmp.emplace_back(it);
//		}
//	}
//	swap(tmp, tq);
//	tmp.clear();
//	auto np = tp.back();
//	auto nq = tq.back();
	info np, nq;
	np.v = 0;
	nq.v = 0;
	for (auto it : tp) if (it.v >= np.v) np = it;
	for (auto it : tq) if (it.v >= nq.v) nq = it; 
	for (auto it : tq) {
		ad.emplace_back((qu){np.x, it.x, np.v + it.v});
	}
	for (auto it : tp) {
		ad.emplace_back((qu){it.x, nq.x, it.v + nq.v});
	}
	skip :
	solve(l, mid);
	solve(mid + 1, r);
}
void mian() {
	cin >> n;
	vector <int> t;
	for (int i = 1; i <= n; i++) {
		int x, y, v;
		cin >> x >> y >> v;
		p[++cp] = (info){x, y, v, 0};
		t.emplace_back(x);
	}
	for (int i = 1; i <= n; i++) {
		int x, y, v;
		cin >> x >> y >> v;
		p[++cp] = (info){x, y, v, 1};
		t.emplace_back(x);
	}
	sort(p + 1, p + cp + 1);
//	for (int i = 1; i <= cp; i++) cerr << p[i].x << " " << p[i].y << " " << p[i].v << "\n";
	cin >> q;
	for (int i = 1; i <= q; i++) {
		int l, r;
		cin >> l >> r;
		f[i] = (qu){l + 1, r - 1, i};
		g[i] = (qu){l - 1, r + 1, i};
		t.emplace_back(r - 1);
		t.emplace_back(r + 1); 
	}
	sort(all(t));
	t.erase(unique(all(t)), t.end());
	m = (int)t.size();
	for (int i = 1; i <= q; i++) {
		f[i].r = lower_bound(all(t), f[i].r) - t.begin() + 1;
		g[i].r = lower_bound(all(t), g[i].r) - t.begin() + 1;
	}
	solve(1, cp);
//	for (int i = 1; i <= cp; i++)
//		for (int j = i + 1; j <= cp; j++) {
//			if (p[i].c == 0 && p[j].c == 1 && p[i].y < p[j].y) 
//				ad.emplace_back((qu){p[i].x, p[j].x, p[i].v + p[j].v});
//		}
	sort(f + 1, f + q + 1);
	sort(g + 1, g + q + 1);
	sort(all(ad));
	for (auto &it : ad) {
//		cerr << it.l << " " << it.r << " " << it.v << "\n";
		it.r = lower_bound(all(t), it.r) - t.begin() + 1;
	}
//	for (int i = 1; i <= q; i++) cerr << f[i].l << " " << f[i].r << "\n";
//	for (int i = 1; i <= q; i++) cerr << g[i].l << " " << g[i].r << "\n";
	int j = -1;
	for (int i = 1; i <= q; i++) {
		while (j + 1 <= (int)ad.size() - 1 && ad[j + 1].l <= g[i].l) {
			j++;
			bit2.mdf(ad[j].r, ad[j].v);
		}
		int id = g[i].v;
		chkmx(ans[id], bit2.qry(g[i].r));
	}
	j = (int)ad.size();
	for (int i = q; i >= 1; i--) {
		while (j - 1 >= 0 && ad[j - 1].l >= f[i].l) {
			j--;
			bit1.mdf(ad[j].r, ad[j].v);
		}
		int id = f[i].v;
		chkmx(ans[id], bit1.qry(f[i].r));
	}
	for (int i = 1; i <= q; i++) {
		if (ans[i]) cout << ans[i] << "\n";
		else cout << "-1\n";
	}
}
int main() {
//	fprintf(stderr, "%.9lfMb\n", 1.0 * (&Mbe - &Med) / 1048576.0);
	ios :: sync_with_stdio(false);
	cin.tie(0), cout.tie(0);
	int t = 1;
	while (t--) mian();
//	cerr << 1e3 * clock() / CLOCKS_PER_SEC << "ms\n"
	return 0;
} 
/*
10
-938 384 791666563
-455 810 540901345
-610 304 571352843
-275 659 601032507
-656 671 293799305
-996 42 519936324
-936 642 100753947
-148 395 135697693
-497 230 567339928
-763 366 395745738
421 613 224178644
315 508 47903043
880 227 41177958
313 572 723249693
733 346 885684010
838 169 429859587
464 707 601508208
27 525 246679278
197 182 351233408
766 739 495575770
1
-333 696
*/ 

标签:tmp,emplace,Algorithm,int,auto,back,tq,Yosupo,GYM102596L
From: https://www.cnblogs.com/came11ia/p/17976158

相关文章

  • 神经网络优化篇:详解Adam 优化算法(Adam optimization algorithm)
    Adam优化算法在深度学习的历史上,包括许多知名研究者在内,提出了优化算法,并很好地解决了一些问题,但随后这些优化算法被指出并不能一般化,并不适用于多种神经网络,时间久了,深度学习圈子里的人开始多少有些质疑全新的优化算法,很多人都觉得动量(Momentum)梯度下降法很好用,很难再想出更好......
  • 基于标签值分布的强化学习推荐算法(Reinforcement Learning Recommendation Algorithm
    前言看论文的第三天,坚持下去。慢慢来,比较快。——唐迟本文基于2023年6月28日发表在MATHEMATICS上的一篇名为“基于标签值分布的强化学习推荐算法”(ReinforcementLearningRecommendationAlgorithmBasedonLabelValueDistribution)的文章。文章提出了一种基于标签分布......
  • JavaSE(13) - 常见算法 algorithm
    JavaSE(13)-常见算法algorithm查找算法Search基本查找BasicSearchpackagealgorithm.search;/*BasicSearch1.用基本查找,查找某个元素在数组中的索引(不考虑重复元素)2.用基本查找,查找某个元素在数组中的索引(考虑重复元素)*/publicclassBasicSearch{public......
  • 基于融合语义信息改进的内容推荐算法。Improved content recommendation algorithm in
    引言路漫漫其修远兮,吾将上下而求索。每天一篇论文,做更好的自己。本文读的这篇论文为发表于2023年5月28日的一篇名为《基于融合语义信息改进的内容推荐算法》(基于融合语义信息改进的内容推荐算法)的文章,文章主要介绍了基于内容的推荐技术在电子商务和教育领域的广泛应用,以及传统基......
  • Top-N推荐算法 Top-N recommendation Algorithms
    引言推荐算法是计算机专业中的一种算法,通过一些计算,能够推测用户喜欢的东西,在互联网环境中应用比较广泛。Top-N算法在生活中非常常见,比如学术论文推荐论文、音乐软件推荐歌曲等。今天看到一篇名叫"ARevisitingStudyofAppropriateOfflineEvaluationforTop-NRecommendati......
  • Proximal Policy Optimization (PPO): A Robust and Efficient RL Algorithm
    1.背景介绍ProximalPolicyOptimization(PPO)是一种强化学习(ReinforcementLearning,RL)算法,它在许多实际应用中表现出色,具有较强的鲁棒性和效率。在这篇文章中,我们将详细介绍PPO的核心概念、算法原理、具体实现以及潜在的未来趋势和挑战。1.1强化学习简介强化学习是一种......
  • A Long read hybrid error correction algorithm based on segmented pHMM
    ALongreadhybriderrorcorrectionalgorithmbasedonsegmentedpHMM  2023/12/1511:06:36The"LongreadhybriderrorcorrectionalgorithmbasedonsegmentedpHMM"referstoaspecificapproachforerrorcorrectioninlong-readse......
  • SR Algorithm Analysis(1)——ZSSR
    SRAlgorithmAnalysis(1)——ZSSRCVPR2017《“Zero-Shot”Super-ResolutionusingDeepInternalLearning》目录SRAlgorithmAnalysis(1)——ZSSRInnovations:Background:ThePowerofInternalImageStatisticswhy?Methods:Image-SpecificCNNSPHowtobuildtheI↓s?Augm......
  • PacBio long-read error correction algorithms
    为了更深入了解纠错策略,以下是一些相关的研究论文,供您参考: 纠错策略的相关研究综述:该综述对国内外专家多年来关于错误和纠错相关理论的研究进行了总结和归纳。其中包括错误分析的相关研究(错误的定义、错误产生的原因、错误的类型)、纠错的相关研究(纠错的定义、纠错的意义、纠......
  • LocPatcH An efficient long-read hybrid error correction algorithm based on local
    该文档主要介绍了一种基于装配的方法和概率隐藏马尔科夫模型(pHMM)用于纠正长读序列的错误。文档详细描述了对酵母数据进行实验的结果、纠正方法的拓扑结构以及实验设置和数据集。 这种基于装配的纠正方法相对于直接纠正存在哪些优势?pHMM的拓扑结构是怎样的?......