比赛 20251001国庆欢乐赛1 评测结果 AWWWAWWWWW
题目名称 国旗计划 最终得分 20
用户昵称 Ruyi 运行时间 1.494 s
代码语言 C++ 内存使用 22.44 MiB
提交时间 2025-10-01 11:57:37
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
int n,m,ans[200001],dp[400001][20];
struct node{
	int i,l,r;
}a[400001];
bool cmp(node x,node y){return x.l<y.l;}
void f1(){
	for(int i=1,cnt=i;i<=2*n;i++){
		while(cnt<=2*n&&a[cnt].l<=a[i].r) cnt++;
		dp[i][0]=cnt-1;
	}
	for(int i=1;i<=2*n;i++)
	for(int j=1;j<20;j++)
	dp[i][j]=dp[dp[i][j-1]][j-1];
	return ;
}
void f2(int k){
	int maxx=a[k].l+m,sum=1,p=k;
	for(int i=19;i>=0;i--){
		if(dp[k][i]!=0&&a[dp[k][i]].r<maxx){
			sum+=(1<<i);
			k=dp[k][i];
		}
	}
	ans[a[p].i]=sum+1;
	return ;
}
int main(){
    freopen("flagplan.in","r",stdin);
    freopen("flagplan.out","w",stdout);
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i].l>>a[i].r;
		if(a[i].r<a[i].l) a[i].r+=m;
		a[i].i=i;
	}
	sort(a+1,a+n+1,cmp);
	for(int i=1;i<=n;i++){
		a[i+n]=a[i];
		a[i+n].l=a[i].l+m;
		a[i+n].r=a[i].r+m;
	}
	f1();
	for(int i=1;i<=n;i++) f2(i);
	for(int i=1;i<=n;i++) cout<<ans[i]<<' ';
	return 0;
}