比赛 进阶指南第0章测试 评测结果 AAAAAAAAAA
题目名称 国旗计划 最终得分 100
用户昵称 小福鑫 运行时间 2.131 s
代码语言 C++ 内存使用 49.05 MiB
提交时间 2026-03-14 13:49:39
显示代码纯文本
#include<bits/stdc++.h>
#define int long long
using namespace std;
struct edge{int l,r,f;}a[500001];
int n,m,l,r,k=1,f[500001][25],ans[500001];
bool cmp(edge a,edge b){return a.l<b.l;}
void solve(int x){
	int now=x,r=0;
	for(int i=20;i>=0;i--){
		if(f[now][i]!=0&&a[f[now][i]].r<a[x].l+m){
			r+=(1<<i);
			now=f[now][i];
		}
	}
	ans[a[x].f]=r+1;
}
signed main(){
	freopen("flagplan.in","r",stdin);
	freopen("flagplan.out","w",stdout);
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>l>>r;
		if(r<l)r+=m;
		a[i]={l,r,i};
	}
	sort(a+1,a+1+n,cmp);
	for(int i=n+1;i<=2*n;i++){
	    a[i]={a[i-n].l+m,a[i-n].r+m,a[i-n].f};
	}
	for(int i=1;i<=2*n;i++){
		while(k<=2*n&&a[i].r>=a[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];
		}
	}
	for(int i=1;i<=n;i++){
		solve(i);
	}
	for(int i=1;i<=n;i++){
		cout<<ans[i]+1<<" ";
	}
}