90pts求调WA on#2
查看原帖
90pts求调WA on#2
911834
bangdeng楼主2024/5/1 20:38

rt

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=4e5+1;
int n,m,cnt,f[N][21],ans[N];
struct line{int l,r,id;}a[N];
bool cmp(line a,line b){return a.l<b.l;}
signed main()
{
	scanf("%lld%lld",&n,&m);
	for(int i=1,l,r;i<=n;i++)
	{
		scanf("%lld%lld",&l,&r);
		if(l>r)a[++cnt]=(line){l,r+m,i};
		else a[++cnt]=(line){l,r,i},a[++cnt]=(line){l+m,r+m,0};
	}
	sort(a+1,a+1+cnt,cmp);
	a[++cnt]=(line){a[cnt-1].r,0,0};
	queue<int>q;
	for(int i=1;i<=cnt;i++)
	{
		while(q.size()&&a[q.front()].r<a[i].l)
		{
			f[q.front()][0]=i-1;
			q.pop();
		}
		q.push(i);
	}
//	f[cnt-1][0]=cnt;
//	for(int i=1;i<=cnt;i++)printf("%d ",f[i][0]);
//	puts("");
	for(int j=0;j<20;j++)for(int i=1;i<=cnt;i++)f[i][j+1]=f[f[i][j]][j];
	for(int i=1;i<=n;i++)
	{
		int sta=i,s=0;
		for(int j=20;j>=0;j--)
		{
			if(a[f[sta][j]].r<a[i].l+m&&f[sta][j])
			{
				sta=f[sta][j];
				s+=(1<<j);
			}
		}
		ans[a[i].id]=s+2;
	}
	for(int i=1;i<=n;i++)printf("%lld ",ans[i]);
}
2024/5/1 20:38
加载中...