【BZOJ1293】[SCOI2009]生日禮物(單調隊列)
阿新 • • 發佈:2018-10-06
true www. www urn pac clas etc zoj php
【BZOJ1293】[SCOI2009]生日禮物(單調隊列)
題面
BZOJ
洛谷
題解
離散之後隨便拿單調隊列維護一下就好了。
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<algorithm> #include<vector> using namespace std; #define ll long long #define MAX 1001000 inline int read() { int x=0;bool t=false;char ch=getchar(); while((ch<'0'||ch>'9')&&ch!='-')ch=getchar(); if(ch=='-')t=true,ch=getchar(); while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar(); return t?-x:x; } vector<int> c[65]; vector<int> E[MAX]; int S[MAX],tot,Q[MAX],h,t,len[MAX]; int n,K,num[65];ll ans=1e18; bool check(int x) { for(int i=0;i<len[x];++i) if(num[E[x][i]]<=1)return false; for(int i=1;i<=K;++i) if(num[i]<=0)return false; return true; } int main() { n=read();K=read();S[0]=-2147483647; for(int i=1;i<=K;++i) { int T=read(); while(T--)c[i].push_back(S[++tot]=read()); } sort(&S[1],&S[tot+1]);tot=unique(&S[1],&S[tot+1])-S-1; for(int i=1;i<=K;++i) for(int j=0,l=c[i].size();j<l;++j) c[i][j]=lower_bound(&S[1],&S[tot+1],c[i][j])-S; for(int i=1;i<=K;++i) for(int j=0,l=c[i].size();j<l;++j) E[c[i][j]].push_back(i); for(int i=1;i<=tot;++i)sort(E[i].begin(),E[i].end()); for(int i=1;i<=tot;++i)len[i]=unique(E[i].begin(),E[i].end())-E[i].begin(); for(int i=1;i<=tot;++i) { Q[++t]=i; for(int j=0;j<len[i];++j)num[E[i][j]]+=1; while(h<t&&check(h)) { for(int j=0;j<len[Q[h]];++j)num[E[Q[h]][j]]-=1; ++h; } if(h<=t)ans=min(ans,1ll*S[i]-S[Q[h]]); } cout<<ans<<endl; return 0; }
【BZOJ1293】[SCOI2009]生日禮物(單調隊列)