牛客多校第九场 Groundhog Looking Dowdy(双指针,卡常)

牛客多校第九场 Groundhog Looking Dowdy(双指针,卡常)_第1张图片

题意:
每天有一些衣服和其价格。
一共n天,你可以从其中选m天,每天指定一个衣服。要求m天中指定衣服的最大值与最小值差最小。

思路:
特别卡常。只能将所有衣服按照价格和日期存下来,再从小到大排序,算出每个衣服第一个离他m天数的衣服,这就对应最小价格。
这个过程可以双指针维护。

#include 
#include 
#include 
#include 
#include 

using namespace std;
typedef long long ll;
const int maxn = 2e6 + 7;
const int mod = 998244353;

int vis[maxn];
struct Node {
    int id,x;
}a[maxn];

int cmp(Node a,Node b) {
    if(a.x == b.x) return a.id < b.id;
    return a.x < b.x;
}

int main() {
    int n,m;scanf("%d%d",&n,&m);
    int cnt = 0;
    for(int i = 1;i <= n;i++) {
        int amt;scanf("%d",&amt);
        for(int j = 1;j <= amt;j++) {
            int x;scanf("%d",&x);
            a[++cnt] = {i,x};
        }
    }
    sort(a + 1,a + 1 + cnt,cmp);
    
    int l = 1,now = 0;
    int ans = 1e9;
    for(int i = 1;i <= cnt;i++) {
        vis[a[i].id]++;
        if(vis[a[i].id] == 1) {
            now++;
            if(now >= m) {
                ans = min(ans,a[i].x - a[l].x);
            }
        }
        while(now >= m) {
            vis[a[l].id]--;
            if(vis[a[l].id] == 0) now--;
            l++;
        }
    }
    printf("%d\n",ans);
    return 0;
}

你可能感兴趣的:(#,其他比赛题目,#,双指针)