1. 程式人生 > 實用技巧 >CCF CSP 202009-2 風險人群篩查

CCF CSP 202009-2 風險人群篩查

202009-2 風險人群篩查

題目背景

某地疫情爆發後,出於“應檢盡檢”的原則,我們想要通知所有近期經過改高危區域的居民參與核酸檢測。

問題描述

想要找出經過高危區域的居民,分析位置記錄時一種簡單有效的方法。具體來說,一位居民的位置記錄包含t個平面座標(\(x_1,y_1\)),(\(x_2,y_2\)),...,(\(x_t,y_t\))表示該居民i時刻所在位置。高危區域則可以抽象為一個矩形區域(含邊界),左下角和右上角的座標分別為(\(x_l,y_d\))和(\(x_r,y_u\)),滿足\(x_l\lt x_r\)\(y_d\lt y_u\)。考慮某位居民的位置記錄,如果其中某個座標位於矩形內(含邊界),則說明該居民經過高危區域;進一步地,如果其中連續

k個或更多座標均位於矩形內(含邊界),則認為該居民曾在高危區域逗留。需要注意的是,判定經過和逗留時我們只關心位置記錄中的t個座標,而無需考慮該居民在i到i+1時刻之間位於何處。給定高危區域的範圍和n位居民過去t個時刻的位置記錄,試統計其中經過高危區域的人數和曾在高危區域逗留的人數。

輸入格式

輸入共n+1行。

第一行包含空格分隔的七個整數\(n,k,t,x_l,y_d,x_r,y_u\),含義如上文所述。

接下來n行,每行包含用空格分隔的2t個整數,按順序表示一位居民過去t個時刻的位置記錄\((x_1,y_1),(x_2,y_2),...,(x_t,y_t)\)

輸出格式

輸出共兩行,每行一個整數,分別表示經過高危區域的人數和曾在高危區域逗留的人數。

樣例輸入1

5 2 6 20 40 100 80

100 80 100 80 100 80 100 80 100 80 100 80

60 50 60 46 60 42 60 38 60 34 60 30

10 60 14 62 18 66 22 74 26 86 30 100

90 31 94 35 98 39 102 106 47 110 51

0 20 4 20 8 20 12 20 16 20 20 20

樣例輸出1

3

2

樣例輸入2

1 3 8 0 0 10 10

-1 -1 0 0 0 0 -1 -1 0 0 -1 -1 0 0 0 0

樣例輸出2

1

0

樣例2說明

該位置記錄經過了高危區域,但最多隻有兩個連續兩個時刻位於其中,不滿足逗留條件。

評測用例規模與約定

全部測試點滿足\(1\le n \le20\)

,\(1\le k\le t \le 10^3\),所有座標均為整數且絕對值不超過\(10^6\)

程式碼

#include<cstdio>
int main(){
	int n,k,t,xl,yd,xr,yu;
	scanf("%d%d%d%d%d%d%d",&n,&k,&t,&xl,&yd,&xr,&yu);
	int i,xi,yi,j,ans1=0,ans2=0;
	int cnt[20]={0}; 
	for(i=0;i<n;i++){
		bool flag = false;
		int temp = 0;
		for(j=0;j < t;j++)
		{
			scanf("%d%d", &xi, &yi);		
			if((xi>=xl&&xi<=xr)&&(yi>=yd&&yi<=yu)){
				cnt[i]++;
				temp++;
				if (cnt[i] >= k){
					flag = true;
				}
			}else{
				cnt[i]=0;
			}		
		}
		if(flag){
			ans2++;
		}
		if(temp){
			ans1++; 
		} 
	}
	printf("%d\n%d",ans1,ans2);	 
    return 0;
}