据说某谷数据十分水。。。但幸好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 ",ans); }
2019.04.27