求调
查看原帖
求调
1263684
Elysialr楼主2024/10/9 19:58
#include<bits/stdc++.h>
using namespace std;
inline int read(){
	int x=0,f=1;char ch=getchar();
	while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
	while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
	return x*f;
}
inline void write(int x) {
    int pointer=0;
    char c[41]={};
    if(!x){putchar('0');putchar(' ');return;}
    if(x < 0){putchar('-');x=-x;}
    while(x){c[++pointer]=x%10+48;x/=10;}
    while(pointer) putchar(c[pointer --]);
    putchar(' ');
}

struct line{
    int l,r,ind,Next[21];
};
bool cmp1(line f1,line f2){
    return f1.l<f2.l;
}
bool cmp2(line f1,line f2){
    return f1.ind<f2.ind;
}

line f[400001];
int n,m,a[200001],logn;

void input(){
    n=read();m=read();
    logn=log2(n)+1;
    for(int i=1;i<=n;i++){
        f[i].ind=i;
        f[i].l=read();
        f[i].r=read();
        f[i].Next[0]=0;
        if(f[i].r<f[i].l)
        f[i].r+=m;

        f[i+n]=f[i];
        f[i+n].ind+=n;
        f[i+n].l+=m;
        f[i+n].r+=m;
    }
}
void prepare(){
    sort(f+1,f+n+1,cmp1);
    for(int i=1,j=1;i<2*n;i++){
        while(f[j].l<=f[i].r&&j<=2*n) j++;
        f[i].Next[0]=f[j-1].ind;
    }
    for(int j=1;j<=logn;j++)
    for(int i=1;i<=2*n;i++)
    f[i].Next[j]=f[f[i].Next[j-1]].Next[j-1];
}

void print(){
    sort(f+1,f+n+1,cmp2); 

    for(int i=1;i<=n;i++){
        int x=i,res=0;
        for(int j=logn;j>=0;j--)
        if(f[f[x].Next[j]].r>f[i].l&&f[f[x].Next[j]].r-f[i].l<m){
            x=f[x].Next[j];
            res+=(1<<j);
        }
        write(res+1);
    }
}

int main(){
    input();
    prepare();
    print();    
    return 0;
}
2024/10/9 19:58
加载中...