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