(没过样例)30pts求助
查看原帖
(没过样例)30pts求助
1016445
fqzcwei楼主2024/10/22 13:27
//P4155
#include<bits/stdc++.h>
using namespace std;
int n,m,dp[400005][20],ans[200005];

struct bing{
	int l,r,id;
}a[400005];

int cmp(bing x, bing y)
{
	return x.l < y.l; 
}

void pre(void){
	for(int i=1,p=i;i<=2*n;i++){
		while(p<=2*n&&a[p].l <a[i].r )p++;
		int sum=p-1;
		dp[i][0]=sum;
	}
	for(int i=1;i<20;i++){
		for(int j=1;j<=2*n;j++){
			dp[j][i] = dp[dp[j][i - 1]][i - 1];
		}
	}
}

void find(int k){
	int lim=a[k].l +m,sum=1;
	int p=k;
	for(int i=19;i>=0;i--){
		if(dp[k][i]!=0&&a[dp[k][i]].r<lim){
			sum+=(1<<i);
			k=dp[k][i];
		}
	}
	ans[a[p].id]=sum+1;
}

int main(){
	
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i].l >>a[i].r ;
		if(a[i].l>a[i].r )a[i].r+=m; 
		a[i].id =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;
	}
	pre();
	for(int i=1;i<=n;i++)find(i);
	for(int i=1;i<=n;i++)cout<<ans[i]<<' ';
	return 0; 
}
2024/10/22 13:27
加载中...