(紀中)2367. 【2019.11NOIP普及組模擬】白板【離散化】

(File IO): input:sheet.in output:sheet.out
時間限制: 1000 ms 空間限制: 528400 KB 具體限制


題目描述
在這裏插入圖片描述


輸入
在這裏插入圖片描述

輸出
在這裏插入圖片描述


樣例輸入
3
2 2 4 4
1 1 3 5
3 1 5 5
3 3 7 5
0 0 4 6
0 0 7 4
5 2 10 5
3 1 7 6
8 1 11 7

樣例輸出
NO
YES
YES

第一個例子中,白板被黑板完全覆蓋。
第二個例子中,部分白板可以看到。比如(6.5,4.5)這個點就可以被看到。


數據範圍限制
在這裏插入圖片描述


解題思路
當時做這道題時,調了好久,55分,最後發現,被題目誤導了。
題目說 “ 第二個例子中,部分白板可以看到。比如(6.5,4.5)這個點就可以被看到。 ”其實畫圖可得,是(7,4)。。。而且根據樣例發現,其實是看到白板中的一個格,並不是一個點,代表白板未被覆蓋。
這道題可以用離散化算法。。。
離散化處理
把三個板的x座標和y座標分別存入x和y數組,從小到大排序,再把座標替換成座標的排序結果,就是這個座標的大小排位,這個排位和平常的考試排位一樣。比如:1 2 5 5 7 的名次排序是 1 2 3 3 5。


代碼
100分

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
long long f[10][10],k,ans,n,a[1000][1000];
struct c{
	int x,y,s;
}x[100],y[100];
bool cmp(const c&l,const c&r){
	return l.x<r.x;
}
int read()
{
	for(int i=1;i<=3;i++){
		scanf("%lld%lld%lld%lld",&f[i][1],&f[i][2],&f[i][3],&f[i][4]);
		x[i].x=f[i][1],x[i].y=1,x[i].s=i;//.x存座標數,用來排序;.y存這個座標是左下x還是左下y、右上x、右上y
		x[i+3].x=f[i][3],x[i+3].y=3,x[i+3].s=i;//+3是因爲要存6個,左下x存前三個,右上的x存後三個
		y[i].x=f[i][2],y[i].y=2,y[i].s=i;//
		y[i+3].x=f[i][4],y[i+3].y=4,y[i+3].s=i;//同上
	}
}
void eee(){
	x[0].x=y[0].x=-1;
	for(int i=1;i<=6;i++)
	{
		if(x[i].x==x[i-1].x)f[x[i].s][x[i].y]=f[x[i-1].s][x[i-1].y];//如果和前一個點一樣,就像分數和前一個人一樣,就和前一個人的名次相同
		else f[x[i].s][x[i].y]=i;//如果不一樣,就和i相等
		if(y[i].x==y[i-1].x)f[y[i].s][y[i].y]=f[y[i-1].s][y[i-1].y];
		else f[y[i].s][y[i].y]=i;
	}
}
void hhh(){
	for(int i=f[1][1]+1;i<=f[1][3];i++)//範圍:這裏因爲提目需求面,但是給的是點,可以-1(簡單粗暴)
		for(int j=f[1][2]+1;j<=f[1][4];j++)
			a[i][j]=1;//標記白板
    for(int i=f[2][1]+1;i<=f[2][3];i++)
		for(int j=f[2][2]+1;j<=f[2][4];j++)
			a[i][j]=0;//標記黑板
    for(int i=f[3][1]+1;i<=f[3][3];i++)
		for(int j=f[3][2]+1;j<=f[3][4];j++)
			a[i][j]=0;//標記黑板
	for(int i=f[1][1]+1;i<=f[1][3];i++){
		for(int j=f[1][2]+1;j<=f[1][4];j++)
			if(a[i][j])//查找白板標記
			{
				ans=1;
				return;
			}
    }
}
int main()
{	
    freopen("sheet.in","r",stdin); 
	freopen("sheet.out","w",stdout);
    scanf("%lld",&n);
	for(long long i=1; i<=n; i++)
	{	
	    ans=0;
		read();//讀入,順便預處理把座標存起來
		sort(x+1,x+6+1,cmp);//
		sort(y+1,y+6+1,cmp);//從小到大排序(我也不知道我爲什麼要寫兩個cmp)
		eee();//把座標替換
		hhh();//50分的統計
		if(ans)
			cout<<"YES"<<endl;
		else
			cout<<"NO"<<endl;
	}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章