ACM-ICPC 2018 徐州賽區網路預賽 F. Features Track

Enjoy_process發表於2018-09-09
  •  1000ms
  •  262144K

Morgana is learning computer vision, and he likes cats, too. One day he wants to find the cat movement from a cat video. To do this, he extracts cat features in each frame. A cat feature is a two-dimension vector <x, y>. If xi​=xj​ and yi​ = yj​, then <xi​, yi​> <xj​,yj​> are same features.

So if cat features are moving, we can think the cat is moving. If feature <a, b> is appeared in continuous frames, it will form features movement. For example, feature <a,b> is appeared in frame 2,3,4,7,8 then it forms two features movement 2-3-4 and 7-8 .

Now given the features in each frames, the number of features may be different, Morgana wants to find the longest features movement.

Input

First line contains one integer T(1≤T≤10) , giving the test cases.

Then the first line of each cases contains one integer n (number of frames),

In The next n lines, each line contains one integer ki​ ( the number of features) and 2ki​ intergers describe ki ​features in ith frame.(The first two integers describe the first feature, the 3rd and 4th integer describe the second feature, and so on).

In each test case the sum number of features N will satisfy N≤100000 .

Output

For each cases, output one line with one integers represents the longest length of features movement.

樣例輸入

1
8
2 1 1 2 2
2 1 1 1 4
2 1 1 2 2
2 2 2 1 4
0
0
1 1 1
1 1 1

樣例輸出

3

題目來源

ACM-ICPC 2018 徐州賽區網路預賽

題目大意:有n個區域,每個區域有k個點(x,y)。各點(x,y)出現的區域中最長的連續區域的長度的最大值

比如,

1  //1組測試
8  //8個區域
2 1 1 2 2  //區域1兩個點 (1,1)  (2,2)
2 1 1 1 4  //區域2兩個點 (1,1)  (1,4)
2 1 1 2 2  //區域3兩個點 (1,1)  (2,2)
2 2 2 1 4  //區域4兩個點 (2,2)  (1,4)
0              //區域5零個點
0              //區域6零個點 
1 1 1        //區域7一個點 (1,1) 
1 1 1        //區域8一個點 (1,1) 

點(1,1)出現在區域1,2,3,7,8 最長的連續區域為1-2-3長度為3

點(2,2)出現在區域1,3,4 最長的連續區域為3-4長度為2

點(1,4)出現在區域2,4最長的連續區域為2或4長度為1

因此最後答案為3

題解:將二維座標用一個數表示,由於x+y的值小於等於100000,因此可以將(x,y)用數 z=x*100001+y 表示,其中x=z/100000 ,y=z%100000 。使用對映map<int,int>s[2],鍵表示位置座標化成的整數,值表示以此區域的這個點結尾的最長連續區間的長度,s[0]記錄上一個區間的點資訊,s[1]記錄本區間的點資訊,由於要連續,因此如果本區域出現了上一個區域沒有出現的點,那麼本區域以這個點結尾的最長連續區間的長度為1,否則為上一個區域相同結點的對應的值加一,每次記錄最大值即可。

AC的C++程式碼:

#include<iostream>
#include<map>

using namespace std;
typedef long long ll;

ll mod=100001;
map<ll,ll>s[2];//記錄上一個區域和此區域的結點資訊 

int main()
{
	int t,r,n,x,y,num;
	scanf("%d",&t);
	while(t--){
		s[0].clear();
		s[1].clear();
		ll ans=0;
		scanf("%d",&r);
		for(int i=1;i<=r;i++){
			s[i%2].clear();
			scanf("%d",&num);
			for(int j=1;j<=num;j++){
				scanf("%d%d",&x,&y);
				ll pos=x*mod+y;//將本區域的點位置化成1維的數 
				s[i%2][pos]=+s[(i-1)%2][pos]+1;
				if(ans<s[i%2][pos])//更新答案 
				  ans=s[i%2][pos];
			}
			s[(i-1)%2].clear();//清空上一個區域的結點資訊 
		}
		printf("%lld\n",ans);
	}
	return 0;
}
 

 

相關文章