1 条题解

  • 0
    @ 2021-01-27 20:51:57
    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    using namespace std;
    const int maxn=100000+10;
    struct node{
        int x,y;
    }a[maxn<<1];
    struct node2{
        int id,l;
    }b[maxn<<2];
    int nxt[maxn<<1][25];
    bool cmp(node2 x,node2 y){
        if(x.l==y.l) return x.id<y.id;
        return x.l<y.l;
    }
    int chkmax(int x,int y){return x>y?x:y;}
    int main(){
        int m,n;
        cin>>m>>n;
        for(int i=1;i<=n;++i){
            int x,y;
            scanf("%d%d",&x,&y);
            if(x>y) y+=m;
            a[i].x=x; a[i].y=y;
            a[i+n].x=x+m; a[i+n].y=y+m;
        }
        int cnt=0;
        for(int i=1;i<=(n<<1);++i){
            b[++cnt].id=i+(n<<1);
            b[cnt].l=a[i].x;
            b[++cnt].id=i;
            b[cnt].l=a[i].y;
        }
        sort(b+1,b+1+(n<<2),cmp);
        int lst=-1;
        for(int i=(n<<2);i>=1;--i){
            int id=b[i].id;
            if(id>(n<<1)){
                id-=(n<<1);
                if(lst<0 || a[lst].y>a[id].y)
                    lst=id;
            }else{
                nxt[id][0]=lst;
            }
        }
        for(int k=0;k<=19;++k)
            for(int i=1;i<=(n<<1);++i){
                if(nxt[i][k]==-1) nxt[i][k+1]=-1;
                else nxt[i][k+1]=nxt[ nxt[i][k] ][k];
            }
        int ans=0;
        for(int i=1;i<=n;++i){
            int tmp=0,j=i;
            for(int k=19;k>=0;--k){
                int t=nxt[j][k];
                if(t>0 && a[t].y<=a[i].x+m){
                    j=t;
                    tmp|=(1<<k);
                }
            }
            ans=chkmax(ans,tmp+1);
        }
        cout<<ans<<endl;
        return 0;
    }
    
  • 1

信息

ID
1003
难度
8
分类
(无)
标签
(无)
递交数
25
已通过
3
通过率
12%
被复制
2
上传者