60分求助

P3740 [HAOI2014] 贴海报

ezoiHQM @ 2017-12-27 19:28:50

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int T,n,ans,cnt,tot,Segment_tree[100010],lazy_tag[100010],Left[10010],Right[10010];
bool _t[10000010];
struct node{
    bool ck;
    int color,x;
    bool operator<(const node&a)const{
        return x<a.x;
    }
}_p[20010];
void pushdown(int o){
    if(lazy_tag[o]){
        lazy_tag[o<<1]=Segment_tree[o<<1]=lazy_tag[o<<1|1]=Segment_tree[o<<1|1]=lazy_tag[o];
        lazy_tag[o]=0;
    }
}
void updata(int o,int l,int r,int L,int R,int x){
    if(L<=l&&r<=R){
        lazy_tag[o]=x;
        Segment_tree[o]=x;
        return;
    }
    pushdown(o);
    int mid=(l+r)>>1;
    if(L<=mid)
        updata(o<<1,l,mid,L,R,x);
    if(R>mid)
        updata(o<<1|1,mid+1,r,L,R,x);
    Segment_tree[o]=0;
}
void query(int o,int l,int r){
    if(Segment_tree[o]){
        _t[Segment_tree[o]]=1;
        return;
    }
    pushdown(o);
    int mid=(l+r)>>1;
    query(o<<1,l,mid);
    query(o<<1|1,mid+1,r);
}
int main(){
    scanf("%d",&T);
    while(T--){
        memset(Segment_tree,0,sizeof(Segment_tree));
        memset(_t,0,sizeof(_t));
        memset(lazy_tag,0,sizeof(lazy_tag));
        tot=cnt=ans=0;
        scanf("%*d%d",&n);
        for(int i=1;i<=n;i++){
            scanf("%d",&_p[++cnt].x);
            scanf("%d",&_p[++cnt].x);
            _p[cnt-1].color=_p[cnt].color=i;
            _p[cnt-1].ck=0;
            _p[cnt].ck=1;
        }
        sort(_p+1,_p+cnt+1);
        _p[1].ck?Right[_p[1].color]=++tot:Left[_p[1].color]=++tot;
        for(int i=2;i<=cnt;i++){
            if(_p[i].x!=_p[i-1].x)
                ++tot;
            _p[i].ck?Right[_p[i].color]=tot:Left[_p[i].color]=tot;
        }
        for(int i=1;i<=n;i++)
            updata(1,1,tot,Left[i],Right[i],i);
        query(1,1,tot);
        for(int i=1;i<=n;i++)
            if(_t[i])
                ++ans;
        printf("%d\n",ans);
    }
    return 0;
}

by Zechariah @ 2019-07-09 21:34:47

@BigYellowDog 中间的部分没有了,比如[1,4]和[7,10]覆盖在[1,10]上面的话,查的时候离散化的数组里面只有1 4 7 10,中间[5,6]还有别的海报就没有了,所以把r+1也加到离散化的数组里,这样的话加入[1,4]的时候会把5加进去,就不会导致4后面还有海报而查不到的情况


上一页 |