变异莫队,有大佬帮忙看看吗??
查看原帖
变异莫队,有大佬帮忙看看吗??
519384
Link_Cut_Y楼主2022/3/20 13:02

看到这道题,感觉有点像莫队,于是写了一个变种莫队(居然没有根号,雾),求路过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;
}

(本人不一定一直在线,请@)

2022/3/20 13:02
加载中...