ACM-ICPC 2018 徐州赛区网络预赛 F. Features Track
标签
- map
简明题意
- 每一个时间都会出现若干个二元组[x, y],现在询问你相同的二元组最长的连续出现的时间长度
思路
- 写一个 m a p < p a i r < i n t , i n t > , v e c t o r < i n t > > map<pair<int, int>, vector<int>> map<pair<int,int>,vector<int>>,去记录一个二元组[x,y]所出现的所有位置,然后去遍历所有的二元组,比如 m a p [ 1 , 2 ] = 1 , 2 , 4 , 5 , 6 map[1,2] = { 1, 2, 4, 5, 6} map[1,2]=1,2,4,5,6,那么显然先对其排序,然后直接扫一遍就可以得出最长连续上升。
注意事项
- 无
总结
- 无
AC代码
#include<cstdio>
#include<vector>
#include<map>
#include<algorithm>
using namespace std;
int n;
map<pair<int, int>, vector<int>> g;
void solve()
{
int t;
scanf("%d", &t);
while (t--)
{
g.clear();
scanf("%d", &n);
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);
g[pair<int, int>(x, y)].push_back(i);
}
}
int ans = 0;
for (auto& it : g)
{
int cnt = 1;
vector<int>& a = it.second;
sort(a.begin(), a.end());
int len = unique(a.begin(), a.end()) - a.begin();
for (int i = 1; i < len; i++)
{
if (a[i] == a[i - 1] + 1)
cnt++;
else
ans = max(ans, cnt), cnt = 1;
}
ans = max(ans, cnt);
}
printf("%d\n", ans);
}
}
int main()
{
freopen("Testin.txt", "r", stdin);
solve();
return 0;
}
双倍经验
- 无