【题解】洛谷 P5995 [PA2014]Lustra

题目传送门 \(\to\) HERE

题目大意

给定两条数轴和若干组区间 \([w1,w2]\)\([h1,h2]\),问是否存在一组区间使得其它所有区间在对应数轴上都是该区间的子集。

分析

其实就是询问区间总合的最值是否属于一组区间~

但是我们也可以换种想法

考虑到我们只需要关注当前要查询的区间与总区间的关系,并且题目并不要求我们必须求出符合要求的区间序号,可以只记录在当前区间之前的区间最值是否有满足条件的区间,并与当前区间进行比较。

由上文我们可以明显地知道,如果当前有区间符合要求,则我们所记录的区间最值就是符合要求的区间,对结果没有影响。

而当前区间与区间最值的关系也显而易见:如果是包含关系则当前区间可能符合要求,如果区间相交则说明当前区间不可能符合要求,如果被包含则当前状况不变

上面分析的实现过程直接在输入过程中就可以实现~

上代码!

Code

#include<bits/stdc++.h>
#define ull unsigned long long
#define ll long long
#define db double
using namespace std;
int T,n;
int w1,w2,h1,h2;
int maw,miw,mah,mih;
bool key;
int main()
{
	scanf("%d",&T);
	while(T--){
		scanf("%d",&n);
		scanf("%d%d%d%d",&miw,&maw,&mih,&mah);
			//先将第一组数据作为总区间 
		key=1;//key记录是否有数据符合要求 
		for(int i=2;i<=n;i++){
			scanf("%d%d%d%d",&w1,&w2,&h1,&h2);
			if(w1<=miw && w2>=maw && h1<=mih && h2>=mah) key=1;
				//当前输入的区间可以作为答案 
			else if(w1>=miw && w2<=maw && h1>=mih && h2<=mah) key=key;
				//被包含,无影响 
			else key=0;
			miw=min(miw,w1);
			maw=max(maw,w2);
			mih=min(h1,mih);
			mah=max(h2,mah);
				//更新总区间 
		}
		if(key) printf("TAK\n");
		else printf("NIE\n");
	}
	return 0;
}

完结撒fa~

posted @ 2020-11-18 07:41  SingularPoint  阅读(104)  评论(0编辑  收藏  举报