題目描述
小K是一個海港的海關工作人員,每天都有許多船只到達海港,船上通常有很多來自不同國家的乘客。
小K對這些到達海港的船只非常感興趣,他按照時間記錄下了到達海港的每一艘船只情況;對于第i艘到達的船,他記錄了這艘船到達的時間ti (單位:秒),船上的乘 客數星ki,以及每名乘客的國籍 x(i,1), x(i,2),…,x(i,k);。
小K統計了n艘船的信息,希望你幫忙計算出以每一艘船到達時間為止的24小時(24小時=86400秒)內所有乘船到達的乘客來自多少個不同的國家。
形式化地講,你需要計算n條信息。對于輸出的第i條信息,你需要統計滿足 ti - 86400 < tp <= ti的船只p,在所有的x(p,j)中,總共有多少個不同的數。
輸入輸出格式
輸入格式:
第一行輸入一個正整數n,表示小K統計了 n艘船的信息。
接下來n行,每行描述一艘船的信息:前兩個整數ti和ki分別表示這艘船到達海港的時間和船上的乘客數量,接下來ki個整數x(i,j)表示船上乘客的國7。
保證輸入的ti是遞增的,單位是秒;表示從小K第一次上班開始計時,這艘船在第 ti 秒到達海港。
保證 , ,, 。
其中表示所有的ki的和。
輸出格式:
輸出n行,第i行輸出一個整數表示第i艘船到達后的統計信息。
輸入輸出樣例
輸入樣例#1:
3
1 4 4 1 2 2
2 2 2 3
10 1 3
輸出樣例#1:
3
4
4
輸入樣例#2:
4
1 4 1 2 2 3
3 2 2 3
86401 2 3 4
86402 1 5
輸出樣例#2:
3
3
3
4
說明
【樣例解釋1】
第一艘船在第1秒到達海港,最近24小時到達的船是第一艘船,共有4個乘客, 分別是來自國家4,1,2,2,共來自3個不同的國家;
第二艘船在第2秒到達海港,最近24小時到達的船是第一艘船和第二艘船,共有 4 + 2 = 6個乘客,分別是來自國家4,1,2,2,2,3,共來自4個不同的國家;
第三艘船在第10秒到達海港,最近24小時到達的船是第一艘船、第二艘船和第 三艘船,共有4+ 2+1=7個乘客,分別是來自國家4,1,2,2,2,3,3,共來自4個不同 的國家。
【樣例解釋2】
第一艘船在第1秒到達海港,最近24小時到達的船是第一艘船,共有4個乘客,分別是來自國家1,2,2,3,共來自3個不同的國家。
第二艘船在第3秒到達海港,最近24小時到達的船是第一艘船和第二艘船,共有4+2=6個乘客,分別是來自國家1,2,2,3,2,3,共來自3個不同的國家。
第三艘船在第86401秒到達海港,最近24小時到達的船是第二艘船和第三艘船,共有2+2=4個乘客,分別是來自國家2,3,3,4,共來自3個不同的國家。
第四艘船在第86402秒到達海港,最近24小時到達的船是第二艘船、第三艘船和第四艘船,共有2+2+1=5個乘客,分別是來自國家2,3,3,4,5,共來自4個不同的國家。
【數據范圍】
這題可以直接暴力,但是只對了7個點,三個超時。
邊讀邊運行。讀入time[i] (船到達的時間)和人數(每個人來自的國家),然后,用while取24小時內船數的最大值(x),再將x條船里的來自不同國家的人數統計出來。就拿到7個點——70分。
代碼如下:
const max=86400;var n,i,ans,t,l,j,k:longint;time:array[-1..1000]of int64;m:array[0..1000]of longint;a:array[1..1000,1..1000]of longint;f:array[1..1000]of boolean;
beginassign(input,'port.in');assign(output,'port.out');reset(input);rewrite(output);readln(n);for i:=1 to n dobeginfillchar(f,sizeof(f),false);ans:=0;read(time[i],m[i]);for j:=1 to m[i] do read(a[i,j]);t:=time[i];l:=i;while (abs(t-time[l-1])+1<=max)and(l>0) do dec(l);for j:=l to i dofor k:=1 to m[j] do if f[a[j,k]]=false then begin inc(ans); f[a[j,k]]:=true; end;writeln(ans);end;close(input);close(output);
end.
更新后的算法:
可以多用一個數組,表示到當前的24小時內,每種人的數量,這樣就可以減少沒必要的循環。
如果當這艘船已經過了24小時,則將這艘船上的每種人的數量減去。
最后就很容易判斷有多少種人。
代碼如下:
var ans,n,head,tail,i,j,time,m,x:longint;a:array[1..2,1..300000]of longint;b:array[1..300000]of longint;
beginreadln(n);head:=1; tail:=1;for i:=1 to n dobeginread(time,m);for j:=tail to tail+m-1 dobeginread(x);a[1,j]:=time;a[2,j]:=x;inc(b[x]);if b[x]-1=0 then inc(ans);end;readln;while time-a[1,head]>=86400 dobegindec(b[a[2,head]]);if b[a[2,head]]=0 then dec(ans);inc(head);end;tail:=tail+m;writeln(ans);end;
end.