其他分享
首页 > 其他分享> > NC20565 生日礼物(双指针)

NC20565 生日礼物(双指针)

作者:互联网

经典双指针分治法,对于每个i,求出最近的r

但是数据比较大,需要一个离散化

#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
typedef pair<int,int> pll;
const int N=1e6+10;
const int inf=0x3f3f3f3f;
vector<int> a[N];
vector<int> g[N];
vector<int> num;
unordered_map<int,int> m1;
int main(){
    ios::sync_with_stdio(false);
    int n,k,j;
    cin>>n>>k;
    int i;
    for(i=1;i<=k;i++){
        int t;
        cin>>t;
        for(j=1;j<=t;j++){
            int x;
            cin>>x;
            g[i].push_back(x);
        }
    }
    for(i=1;i<=k;i++){
        for(auto x:g[i]){
            num.push_back(x);
        }
    }
    sort(num.begin(),num.end());
    num.erase(unique(num.begin(),num.end()),num.end());
    for(i=1;i<=k;i++){
        for(auto x:g[i]){
            int pos=lower_bound(num.begin(),num.end(),x)-num.begin();
            a[pos].push_back(i);
        }
    }
    ll ans=1e9;
    int cnt=0;
    int l=0,r=0;
    for(i=0;i<num.size();i++){
        while(cnt<k&&r<num.size()){
            for(auto x:a[r]){
                m1[x]++;
                if(m1[x]==1){
                    cnt++;
                }
            }
            r++;
        }
        if(cnt==k){
            ans=min(ans,1ll*num[r-1]-num[i]);
        }
        for(auto x:a[i]){
            m1[x]--;
            if(!m1[x])
                cnt--;
        }
    }
    cout<<ans<<endl;
    return 0;
}
View Code

 

标签:typedef,const,int,NC20565,long,生日礼物,vector,指针
来源: https://www.cnblogs.com/ctyakwf/p/14517139.html