# Geometry# Iteration# Conditional Statements

b182 - 3. 矩形的內部與外部

🔗 前往 ZeroJudge 原題

題目描述

題目要求計算給定點被多個矩形包含的總面積。輸入包含矩形的數量和座標,以及查詢點的數量和座標。對於每個查詢點,程式需要遍歷所有矩形,判斷點是否在矩形內部,並將包含該點的矩形面積累加。

解題思路

程式首先讀取矩形的數量 a 和查詢點的數量 b。然後,對於每個矩形,讀取其四個座標,並確保座標的順序是左下角和右上角。計算矩形的面積,並儲存起來。接著,對於每個查詢點,讀取其座標,遍歷所有矩形,判斷該點是否在矩形的範圍內。如果點在矩形內部,則將矩形的面積加到總面積中。最後,輸出每個查詢點的總面積。

複雜度分析

  • 時間複雜度: O(a * b),其中 a 是矩形的數量,b 是查詢點的數量。因為對於每個查詢點,都需要遍歷所有矩形。
  • 空間複雜度: O(a * 5),因為程式使用一個 a x 5 的二維陣列來儲存矩形資訊。

程式碼

#include <stdio.h>
int main(){
	long long int a,b,x,y;
	while(scanf("%lld%lld",&a,&b)>0){
		long long int n[a][5];
		for(long long int i=0;i<a;i++){
			scanf("%lld%lld%lld%lld",&n[i][0],&n[i][1],&n[i][2],&n[i][3]);
			if(n[i][0]>n[i][2]){
				n[i][0]^=n[i][2];
				n[i][2]^=n[i][0];
				n[i][0]^=n[i][2];
			}
			if(n[i][1]>n[i][3]){
				n[i][1]^=n[i][3];
				n[i][3]^=n[i][1];
				n[i][1]^=n[i][3];
			}
			n[i][4]=(n[i][2]-n[i][0])*(n[i][3]-n[i][1]);
		}
		for(long long int i=0,ans=0;i<b;i++,ans=0){
			scanf("%lld%lld",&x,&y);
			for(long long int ii=0;ii<a;ii++){
				if(x>=n[ii][0]&&x<=n[ii][2]&&y>=n[ii][1]&&y<=n[ii][3]){
					ans+=n[ii][4];
				}
			}
			printf("%lld\n",ans);
		}
	}
	return 0;
}

Discussion