AOJ2600 Koto Distance

問題はこちら
Koto Distance | Aizu Online Judge

X方向に重なるか、Y方向に重なれば問題ない。

通常の0,1,2,3・・・の座標だけではWi-fiの端末機の重なりを表現するのが
難しかったため、
中間座標を作るために、配列のサイズを2倍とり、偶数箇所は通常の座標
奇数箇所は中間座標(0.5,1.5等)を作った。

その後は累積和を取り、配列が終点以外全て1以上であることを確認する。

#include <iostream>

#define REP(i,n) for(int i=0;i<n;i++)
#define DEBUG 1

using namespace std;

int minusToZero(int a){
	if(a<=0){
		return 0;
	}
	else return a;
}

int overNumToLimit(int a,int limit){
	if(a>=limit){
		return limit;
	}else{
		return a;
	}
}

int main(){


	int n,w,h;
	cin>>n>>w>>h;

	int *flagX;
	int *flagY;
	flagX = new int[2*w+1];
	flagY = new int[2*h+1];

	REP(i,2*w+1){
		flagX[i]=0;
	}
	REP(i,2*h+1){
		flagY[i]=0;
	}

	REP(i,n){
		int tmpX,tmpY,tmpW;
		cin>>tmpX>>tmpY>>tmpW;

		flagX[ minusToZero(2*(tmpX-tmpW)) ]++;
		flagX[ overNumToLimit(2*(tmpX+tmpW)+1, 2*w)]--;

		flagY[ minusToZero(2*(tmpY-tmpW)) ]++;
		flagY[ overNumToLimit(2*(tmpY+tmpW)+1, 2*h)]--;
	}

	int ansFlag=0;
	for(int i=1;i<2*w+1;i++){
		flagX[i]+=flagX[i-1];
	}
	for(int i=1;i<2*h+1;i++){
		flagY[i]+=flagY[i-1];
	}
	REP(i,2*w){
		if(flagX[i]<=0){
			ansFlag++;
			break;
		}
	}
	REP(i,2*h){
		if(flagY[i]<=0){
			ansFlag++;
			break;
		}
	}
	if(ansFlag==2){
		cout<<"No"<<endl;
	}else{
		cout<<"Yes"<<endl;
	}

}