• 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
    没有人不辛苦,只有人不喊疼
  • 相关阅读:
    hdu 1520(简单树形dp)
    hdu 1561(树形dp)
    hdu 2809(状压dp)
    hdu 2196(求树上每个节点到树上其他节点的最远距离)
    hdu 4003(树形dp)
    hdu 3899(树形dp)
    hdu 4714(树形dp)
    hdu 3905(dp)
    Linux mariadb(Mysql)的主从复制架构
    面向对象静态变量代码题
  • 原文地址:https://www.cnblogs.com/ctyakwf/p/14517139.html
Copyright © 2020-2023  润新知