BZOJ 5168 && Luogu P3740 [HAOI2014]贴海报 线段树~~

据说某谷数据十分水。。。但幸好BZOJ上也过了。。。话说我记得讲课时讲的是奇奇怪怪的离散化。。但现在突然觉得什么都可以线段树瞎搞了。。。QAQ


直接就是这个区间有没有被覆盖,被覆盖直接return; 如果出现修改,那么就说明它能被看见,++ans

短的一批的线段树(去了不必要的操作码量还是很小的。。。)

#include<cstdio>
#include<iostream>
#define R register int
#define ls (tr<<1)
#define rs (tr<<1|1)
const int N=10000010,M=1010;
using namespace std;
inline int g() {
    R ret=0,fix=1; register char ch; while(!isdigit(ch=getchar())) fix=ch=='-'?-1:fix;
    do ret=ret*10+(ch^48); while(isdigit(ch=getchar())); return ret*fix;
} int n,m,ans,l[M],r[M];
bool flg[N<<2],cv;
inline void change(int tr,int l,int r,int LL,int RR) {
    if(flg[tr]) return ; if(LL<=l&&r<=RR) {flg[tr]=cv=true; return ;}
    R md=l+r>>1; if(LL<=md) change(ls,l,md,LL,RR); if(RR>md) change(rs,md+1,r,LL,RR); 
    flg[tr]=flg[ls]&flg[rs];
}
signed main() {
    n=g(),m=g(); for(R i=1;i<=m;++i) l[i]=g(),r[i]=g();
    for(R i=m;i;--i) cv=false,change(1,1,n,l[i],r[i]),ans+=cv;
    printf("%d\n",ans);
}

2019.04.27

 

posted @ 2019-04-28 00:00  LuitaryiJack  阅读(135)  评论(0编辑  收藏  举报