[HAOI2014] 贴海报

xiaoxiao2021-02-28  46

题目描述:

线段树覆盖题目…

题目分析:

离散化+线段树区间更新,最后直接遍历一下整个线段树,把标记全部下放一下,最后O1查询就好了…

题目链接:

BZOJ 5168 Luogu 3740

Ac 代码:

// luogu-judger-enable-o2 #include <cstdio> #include <iostream> #include <algorithm> #include <cstring> const int maxm=1e5+100; int tag[maxm<<2],ans[maxm],vis[maxm]; int hash[maxm*6],al[maxm],ar[maxm]; int n,m,cnt,tot; inline void col(int o,int c){tag[o]=c;} inline void pushdown(int o) { if(tag[o]) col((o<<1),tag[o]),col((o<<1)|1,tag[o]); tag[o]=0; } void modify(int o,int l,int r,int ql,int qr,int c) { if(ql<=l&&r<=qr) return (void)(col(o,c)); pushdown(o); int mid=(l+r)>>1; if(ql<=mid) modify((o<<1),l,mid,ql,qr,c); if(qr>mid) modify((o<<1)|1,mid+1,r,ql,qr,c); } void cover(int o,int l,int r) { if(l>=r) return (void)(ans[l]=tag[o]); pushdown(o); int mid=(l+r)>>1; cover((o<<1),l,mid),cover((o<<1)|1,mid+1,r); } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) { scanf("%d%d",&al[i],&ar[i]); hash[++tot]=al[i],hash[++tot]=ar[i]; hash[++tot]=al[i]-1,hash[++tot]=al[i]+1; hash[++tot]=ar[i]-1,hash[++tot]=ar[i]+1; } std::sort(hash+1,hash+tot+1); cnt=std::unique(hash+1,hash+tot+1)-hash-1; for(int i=1;i<=m;i++) { int ql=std::lower_bound(hash+1,hash+cnt+1,al[i])-hash; int qr=std::lower_bound(hash+1,hash+cnt+1,ar[i])-hash; modify(1,1,cnt,ql,qr,i); } int Ans=0; vis[0]=1; cover(1,1,cnt); for(int i=1;i<=cnt;i++) if(!vis[ans[i]]) Ans++,vis[ans[i]]=1; printf("%d\n",Ans); return 0; }
转载请注明原文地址: https://www.6miu.com/read-2631643.html

最新回复(0)