比赛 进阶指南第0章测试 评测结果 AAAAAAAAAA
题目名称 国旗计划 最终得分 100
用户昵称 exil 运行时间 2.237 s
代码语言 C++ 内存使用 49.04 MiB
提交时间 2026-03-14 12:52:28
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
#define int long long
struct node{
    int l,r,hao;
};
node shu[500005];
int f[500005][25];
bool cmp(node a,node b){
    return a.l<b.l;
}

int n,m;
void yu(){
    int k=1;
    for(int i = 1;i<=2*n;i++){
        while(k<=2*n && shu[i].r>=shu[k].l)k++;
        f[i][0]=k-1; 
    }
    
    for(int j = 1;j<=20;j++){
        for(int i = 1;i<=2*n;i++){
            f[i][j]=f[f[i][j-1]][j-1];
            
        }
        
    }
    
}
int ans[500005];
void solve(int dian){
    int now=dian;
    int r=0;
    for(int i = 20;i>=0;i--){
        if(f[now][i]!=0 && shu[f[now][i]].r<shu[dian].l+m){
            r+=(1<<i);
            now=f[now][i];
        }
    }
    ans[shu[dian].hao]=r+1;
}
signed main(){
    freopen("flagplan.in","r",stdin);
    freopen("flagplan.out","w",stdout);
    cin>>n>>m;
    for(int i = 1;i<=n;i++){
        int l,r;
        cin>>l>>r;
        if(r<l)r+=m;
        shu[i].l=l;
        shu[i].r=r;
        shu[i].hao=i;
    }
    sort(shu+1,shu+1+n,cmp);
    for(int i =n+1;i<=2*n;i++){
        shu[i].l=shu[i-n].l+m;
        shu[i].r=shu[i-n].r+m;
        shu[i].hao=shu[i-n].hao;
    }
    yu();
    for(int i = 1;i<=n;i++){
        solve(i);
    }
    for(int i = 1;i<=n;i++){
        cout<<ans[i]+1<<" ";
    }
    return 0;
}