比赛 20251001国庆欢乐赛1 评测结果 AWAAAAAAAA
题目名称 国旗计划 最终得分 90
用户昵称 郑霁桓 运行时间 1.245 s
代码语言 C++ 内存使用 42.80 MiB
提交时间 2025-10-01 10:15:39
显示代码纯文本
#include<bits/stdc++.h> 
using namespace std;
long long n,m,t,nt[25][400005],as[200005],ii,nn;
struct nm{
    long long l,r,id;
}a[400005];
bool cc(nm xx,nm yy){
    if(xx.r==yy.r) return xx.l<yy.l;
    return xx.r<yy.r;
}
int main(){
    freopen("flagplan.in","r",stdin);
    freopen("flagplan.out","w",stdout);
    ios::sync_with_stdio(false);
    cin>>n>>m,nn=n;
    for(int i=1;i<=n;i++){
        cin>>a[i].l>>a[i].r,a[i].id=i;
        if(a[i].r<a[i].l) a[i].r+=m;
        else t++,a[n+t]={a[i].l+m,a[i].r+m,n+t};
    }
    n+=t;
    sort(a+1,a+n+1,cc),a[n+1].l=m*4;
    for(int i=1,j=1;i<=n;i++){
        while(j+1<=n&&a[j+1].l<=a[i].r) j++;
        if(i!=j) nt[0][i]=j;
    }
    
    for(int i=1;i<=20;i++){
        for(int j=1;j<=n;j++){
            nt[i][j]=nt[i-1][nt[i-1][j]];
        }
    }
    for(int i=1;i<=n;i++){
        if(a[i].l>m) continue;
        ii=i;
        for(int j=20;j>=0;j--){
            if(nt[j][ii]&&a[nt[j][ii]].r<a[i].l+m) ii=nt[j][ii],as[a[i].id]+=(1<<j);
        }
        if(a[ii].r<a[i].l+m) as[a[i].id]++;
    }
    for(int i=1;i<=nn;i++) cout<<as[i]+1<<" ";
    return 0;
}