看到这道题,感觉有点像莫队,于是写了一个变种莫队(居然没有根号,雾),求路过dalao帮忙看一下怎么能卡过去。
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <unordered_map>
#define x first
#define id second
using namespace std;
typedef pair<int, int> PII;
const int N = 5e4 + 10;
PII cows[N];
int cnt[N];
unordered_map<int, int> Map;
int id_sum, n, ans = 0x3f3f3f3f;
void add(int x, int &res)
{
if (!cnt[x]) res ++ ;
cnt[x] ++ ;
}
void del(int x, int &res)
{
cnt[x] -- ;
if (!cnt[x]) res -- ;
}
int main()
{
scanf("%d", &n);
for (int i = 1; i <= n; i ++ )
scanf("%d%d", &cows[i].x, &cows[i].id);
for (int i = 1; i <= n; i ++ )
{
if (Map[cows[i].id]) continue;
Map[cows[i].id] = ++ id_sum;
}
sort(cows + 1, cows + n + 1);
int i = 0, j = 1, res = 0;
for (int l = 1; l <= n - id_sum + 1; l ++ )
for (int r = l + id_sum - 1; r <= n; r ++ )
{
while (i < r) add(Map[cows[ ++ i].id], res);
while (i > r) del(Map[cows[i -- ].id], res);
while (j < l) del(Map[cows[j ++ ].id], res);
while (j > l) add(Map[cows[ -- j].id], res);
if (res == id_sum) ans = min(ans, cows[r].x - cows[l].x);
}
cout << ans << endl;
return 0;
}
(本人不一定一直在线,请@)