2018 ICPC 徐州网络预赛 Features Track (STL map pair)

时间:2023-03-09 17:16:34
2018 ICPC 徐州网络预赛 Features Track (STL map pair)

【传送门】https://nanti.jisuanke.com/t/31458

【题目大意】有N个帧,每帧有K个动作特征,每个特征用一个向量表示(x,y)。两个特征相同当且仅当他们在不同的帧中出现且向量的两个分量分别相等。求最多连续相同特征的个数?

【题解】用一个map来维护帧中特征的信息,map中的键即读入的向量,因此用一个pair<int , int>表示,键的值也是一个pair,需要记录它当前已经连续了多少次,还需要记录它上一次出现的帧的位置。如果它上一帧没有出现过,那么它的连续次数就要被置成1;如果上次出现了,则继续累加。用ans维护某个键最大连续出现次数。

map<pair<int ,int> , pair<int ,int>>

map[ pair(x,y)].first为该特征(x.y)连续次数

map[ pair(x,y)].second为该特征上一次出现的帧序号,用于下一次判断连续性

【AC代码】

#include <cstdio>
#include <cstring>
#include <map>
#include <iostream>
#include <utility>
#include <algorithm>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
map<pii , pii> mp;
int main(){
int t;
cin>>t;
int n,k,x,y,ans ;
while(t--){
ans = -;
cin>>n;
for(int i=; i<=n; i++){
cin>>k;
for(int j=; j<=k; j++){
cin>>x>>y;
if(mp[ pii(x,y) ].second == i - ) mp[ pii(x,y) ].first++;
else if(mp[ pii(x,y) ].second == i) continue;
else mp[ pii(x,y) ].first = ;
ans = max(ans , mp[ pii(x,y) ].first);
mp[ pii(x,y) ].second = i;
}
}
cout<<ans<<endl;
} return ;
}