ACM-ICPC 2018 徐州赛区网络预赛 F Features Track(STL模拟)

https://nanti.jisuanke.com/t/31458

题意

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

分析

用一个map来维护帧中特征的信息,map中的键即读入的向量,因此用一个pair<int , int>表示。

键的值也是一个pair,需要记录它当前已经连续了多少次,还需要记录它上一次出现的帧的位置。如果它上一帧没有出现过,那么它的连续次数就要被置成1;如果上次出现了,则继续累加。用ans维护某个键最大连续出现次数。

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

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

#include<bits/stdc++.h>
using namespace std;
 
#define e exp(1)
#define pi acos(-1)
#define mod 1000000007
#define inf 0x3f3f3f3f
#define ll long long
#define ull unsigned long long
#define mem(a,b) memset(a,b,sizeof(a))
int gcd(int a,int b){return b?gcd(b,a%b):a;}
 
typedef pair<int,int> pii;
map<pii,pii> mp;
int main()
{
    int T;scanf("%d",&T);
    while(T--)
    {
        int n;scanf("%d",&n);
        int ans=-1;
        for(int i=1; i<=n; i++)
        {
            int k;scanf("%d",&k);
            for(int j=1; j<=k; j++)
            {
                int x,y;scanf("%d%d",&x,&y);
                if(mp[pii(x,y)].second==i-1)
                    mp[ pii(x,y) ].first++;
                else if(mp[pii(x,y)].second==i)
                    continue;
                else mp[ pii(x,y) ].first = 1;
                
                ans=max(ans,mp[pii(x,y)].first);
                mp[pii(x,y)].second=i;
            }
        }
        printf("%d
",ans);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/fht-litost/p/9668557.html