首页 > 其他分享 >Luogu P4793 [AHOI2008] 矩形藏宝地

Luogu P4793 [AHOI2008] 矩形藏宝地

时间:2023-01-16 08:56:43浏览次数:58  
标签:x1 int Luogu P4793 矩形 CDQ AHOI2008 x2 y2

链接
难度:\(\texttt{省选/NOI-}\)


有 \(n\) 个矩形,左下角为 \((x1,y1)\),右上角为 \((x2,y2)\),问被其他的矩形包含的矩形有多少个。

数据范围:\(1\le n\le200000,x1<x2,y1<y2,x,y互不相同\ \mathtt{1s\sim 3s\ 125MB}\)。


CDQ 萌新受到了很大的震撼。


发现这个题其实是个四维偏序,但是问的是是否可行,其实是可以用三维 CDQ 解决的。

以 \(x1\) 为第一维,\(y1\) 为第二维(这应该挺好想到),那只需要考虑 \(x2\) 和 \(y2\) 的关系了。

维护后缀 \(x\) 的最大高度 \(y\) 最大值,若是属于左半部分则把 \(y2\) 扔到 \(x2\) 的位置更新最大值,若是询问则查询 \(\ge x2\) 的位置的最大值,若 \(>y2\) 则说明有解。

大致说明:因为第一维为 \(x1\),所以可得左半部分 \(x1<\) 右半部分 \(x1\),又因第二维为 \(y1\),能保证遍历时肯定为 \(y1\) 递增,每次更新是由左半部分其 \(x1\) 会更小所以更新后缀没有问题,至于询问前面已提到 \(x1\) 已满足条件那 \(x2\) 找后缀相当于找的就是能包含该矩形的最大高度 \(y\),若 \(y>y2\) 则满足条件。


# include <bits/stdc++.h>
using namespace std;
const int N = 200000;
struct node {
	int x1, y1, x2, y2, id;
} a [N + 10], p [N + 10];
int mx [N + 10 << 2];
void update (int k, int l, int r, int x, int y) {
	if (l == r) {
		mx [k] = y;
		return ;
	}
	int mid = l + r >> 1;
	if (x <= mid) {
		update (k << 1, l, mid, x, y);
	}
	else {
		update (k << 1 | 1, mid + 1, r, x, y);
	}
	mx [k] = max (mx [k << 1], mx [k << 1 | 1]);
	return ;
}
int query (int k, int l, int r, int x) {
	if (l == r) {
		return mx [k];
	}
	int mid = l + r >> 1;
	if (x <= mid) {
		return max (query (k << 1, l, mid, x), mx [k << 1 | 1]);
	}
	return query (k << 1 | 1, mid + 1, r, x);
}// 其实可以转化为前缀 max 改用树状数组
int tag [N + 10];
int n;
int ans [N + 10];
void CDQ (int l, int r) {
	if (l == r) {
		return ;
	}
	int mid = l + r >> 1;
	CDQ (l, mid);
	CDQ (mid + 1, r);
	for (int i = l; i <= mid; ++ i) {
		tag [a [i] .id] = 1;
	}
	for (int i = l; i <= r; ++ i) {
		p [i] = a [i];
	}
	sort (p + l, p + 1 + r, [&] (node a, node b) {
		return a .y1 < b .y1;
	});
	for (int i = l; i <= r; ++ i) {
		if (tag [p [i] .id]) {
			update (1, 1, n, p [i] .x2, p [i] .y2);
		}
		else if (query (1, 1, n, p [i] .x2) > p [i] .y2) {
			ans [p [i] .id] = 1;
		}
	}
	for (int i = l; i <= mid; ++ i) {
		update (1, 1, n, a [i] .x2, 0);
		tag [a [i] .id] = 0;
	}
	return ;
}
int x [N + 10];
int main () {
	scanf ("%d", & n);
	for (int i = 1; i <= n; ++ i) {
		scanf ("%d %d %d %d", & a [i] .x1, & a [i] .y1, & a [i] .x2, & a [i] .y2);
		a [i] .id = i;
		x [i] = a [i] .x2;
	}
	sort (x + 1, x + 1 + n);
	int m = unique (x + 1, x + 1 + n) - x - 1;
	for (int i = 1; i <= n; ++ i) {
		a [i] .x2 = lower_bound (x + 1, x + 1 + n, a [i] .x2) - x;
	}
	sort (a + 1, a + 1 + n, [&] (node a, node b) {
		return a .x1 < b .x1;
	});
	CDQ (1, n);
	int tot = 0;
	for (int i = 1; i <= n; ++ i) {
		tot += ans [i]; 
	}
	printf ("%d\n", tot);
	return 0;
}

标签:x1,int,Luogu,P4793,矩形,CDQ,AHOI2008,x2,y2
From: https://www.cnblogs.com/lhzQAQ/p/17054654.html

相关文章

  • Luogu P4013 数字梯形问题
    说实话这道题挺乐的,去年11月学网络流时碰到这道题,一直没想通,结果碰到考试月,被遣返回家,一个多月没摸了,今天看到这道题一下子想通了,于是想记下来。题目传送门P4013数字梯......
  • Luogu7509 撕裂消除 - 期望dp -
    题目链接:https://www.luogu.com.cn/problem/P7509题解:设\(dp[i][j][0/1]\)表示考虑到第\(i\)个位置,已经形成了极大的\(j\)段,当前位置为0/1的期望值;\(g[i][j][0......
  • 【luogu CF1707D】Partial Virtual Trees(容斥)(DP)
    PartialVirtualTrees题目链接:luoguCF1707D题目大意给你一棵以1为根的数,问你对于每个长度,有多少个点集序列,第一个点集是全部点,最后一个点集只有1号点,且中间每个点......
  • luogu P3518 [POI2011]SEJ-Strongbox | loj #2160. 「POI2011 R2 Day0」保险箱 Strong
    代码已在loj上不开O2通过。下文均在\(Z_n\)下考虑。首先,你考虑选出一些数,能组成的数。即ttps://www.cnblogs.com/xugangfan/p/17040634.html那么对于一个不在群......
  • Luogu P5465 [PKUSC2018] 星际穿越
    观察可以发现一个结论,可以视作每个点\(i\)可以一步到达\(l_i\simn\)的每一个点。发现对于\(a<b<x\),\(dist(a,x)\gedist(b,x)\)第一步是相当特殊的,因为第一步......
  • luogu P5291 [十二省联考 2019] 希望
    题面传送门真的很想吐。题目的意思大概就是在一棵树上选出\(k\)个联通块,使得这\(k\)个联通块有交。显然联通块的交还是联通块,因此转化为对联通块计数。而联通块个数等于......
  • [luogu]P2123 皇后游戏
    题目传送门分析和国王游戏一样的思路直接考虑邻项交换观察易知排在后面的大臣获得的奖赏一定更多假设前\(i-1\)位左手上的数和为\(a\),第\(i-1\)位获得奖赏为\(......
  • luogu P1971 [NOI2011] 兔兔与蛋蛋游戏
    题面传送门没想到二分图博弈这么早就考了?首先我们发现,如果将和起点行列之和奇偶性一样的点设为黑色,其余设为白色,那么每次空格只会在异色边之间走,而不会在同色边之间走。......
  • Luogu P4592 [TJOI2018]异或 做题记录
    随机跳的。树上维护序列,显然树剖。维护异或,显然01trie。01trie维护区间异或,显然可持久化一下。看到时限很大,显然可以双log。于是跑一边树剖,再根据id暴力建一个可......
  • luogu P5037 抓捕
    ##题意有$n$个点的图,任意一点$x$到可去另外一点$y$必须互质,即$\gcd(x,y)=1$。图无边权,但是拥有点权。求到终点$en$的最短距离。---##思路此题需使用Dijks......