bzoj 1293: [SCOI2009]生日礼物【单调队列】
2018-10-02 17:59
435 查看
一开始用了复杂度看起来对实则常数巨大的线段树+hash……后来发现队列就行……
把珠子按位置排序,然后用队列维护一段,枚举右端点更新答案即可
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; const int N=1000005,inf=2147483647; int n,m,s[65],ans=inf,tot,sum,l=1,r; struct qwe { int k,p; qwe(int K=0,int P=0) { k=K,p=P; } }a ,q ; bool cmp(const qwe &a,const qwe &b) { return a.p<b.p; } int read() { int r=0,f=1; char p=getchar(); while(p>'9'||p<'0') { if(p=='-') f=-1; p=getchar(); } while(p>='0'&&p<='9') { r=r*10+p-48; p=getchar(); } return r*f; } int main() { n=read(),m=read(); for(int i=1;i<=m;i++) for(int t=read();t>=1;t--) a[++tot]=qwe(i,read()); sort(a+1,a+n+1,cmp); for(int i=1;i<=n;i++) { q[++r]=a[i]; if(++s[q[r].k]==1) sum++; while(sum==m) { ans=min(ans,q[r].p-q[l].p); s[q[l].k]--; if(s[q[l].k]==0) sum--; l++; } } printf("%d\n",ans); return 0; }
极蠢线段树
// luogu-judger-enable-o2 #include<iostream> #include<cstdio> #include<vector> #include<algorithm> #include<map> using namespace std; const int N=1000005; int n,m,g ,tot,rl ,has,ans=2e9,mn=0; vector<int>a[65],b ; map<int,int>mp; struct xds { int l,r,mn; }t[505]; int read() { int r=0,f=1; char p=getchar(); while(p>'9'||p<'0') { if(p=='-') f=-1; p=getchar(); } while(p>='0'&&p<='9') { r=r*10+p-48; p=getchar(); } return r*f; } void build(int ro,int l,int r) { t[ro].l=l,t[ro].r=r; if(l==r) return; int mid=(l+r)>>1; build(ro<<1,l,mid); build(ro<<1|1,mid+1,r); } void update(int ro,int p,int v) { if(t[ro].l==t[ro].r) { t[ro].mn=v; return; } int mid=(t[ro].l+t[ro].r)>>1; if(p<=mid) update(ro<<1,p,v); else update(ro<<1|1,p,v); t[ro].mn=min(t[ro<<1].mn,t[ro<<1|1].mn); } int main() { n=read(),m=read(); for(int i=1;i<=m;i++) { for(int j=read();j>=1;j--) { g[++tot]=read(); a[i].push_back(g[tot]); } mn=max(mn,a[i][0]); } sort(g+1,g+1+tot); for(int i=1;i<=tot;i++) if(i==1||g[i]!=g[i-1]) mp[g[i]]=++has,rl[has]=g[i]; for(int i=1;i<=m;i++) for(int j=0,len=a[i].size();j<len;j++) b[mp[a[i][j]]].push_back(i); build(1,1,m); for(int i=1;i<=has;i++) if(rl[i]>=mn) { for(int j=0,len=b[i].size();j<len;j++) update(1,b[i][j],rl[i]); ans=min(ans,rl[i]-t[1].mn); } printf("%d\n",ans); return 0; }
相关文章推荐
- [bzoj1293][SCOI2009]生日礼物(单调队列)
- 【bzoj 1293】[SCOI2009]生日礼物(乱搞|单调队列)
- BZOJ 1293: [SCOI2009]生日礼物【单调队列】
- [BZOJ 1293][SCOI2009]生日礼物:单调队列
- bzoj 1293: [SCOI2009]生日礼物 (单调队列)
- [BZOJ 1293] SCOI 2009 生日礼物 · 单调队列
- [BZOJ1293][SCOI2009]生日礼物(单调队列)
- [bzoj1293][SCOI2009]生日礼物 单调队列优化dp
- 【bzoj 1293】[SCOI2009] 生日礼物 指针维护队列
- BZOJ 1293 [SCOI2009] 生日礼物
- 【BZOJ】1293 [SCOI2009]生日礼物 (这题有多种解法)
- bzoj1296 [SCOI2009]粉刷匠 分组背包/单调队列优化
- BZOJ 1293: [SCOI2009]生日礼物 链表模拟
- bzoj 1293: [SCOI2009]生日礼物
- 【BZOJ1293】【SCOI2009】生日礼物 单调性
- 1293: [SCOI2009]生日礼物 - BZOJ
- BZOJ 1293 [SCOI2009] 生日礼物 题解与分析
- bzoj1293: [SCOI2009]生日礼物 贪心
- 【BZOJ 1293】【SCOI 2009】生日礼物
- bzoj 1293: [SCOI2009]生日礼物