求条,样例错误
查看原帖
求条,样例错误
686471
Lan_yan楼主2025/7/2 15:20
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5;
int n,m;
int f[2*N][35],yan[2*N];
struct flag{int l,r,id;}lan[2*N];
bool cmp(flag x,flag y){return x.l<y.l;}
void dfs()
{
	for(int i=1,j=i;i<=2*n;i++)
	{
		while(j<=2*n&&lan[i].r>=lan[j].l)
			j++;
		f[i][0]=j-1;
		
	}
	for(int i=1;i<20;i++)
		for(int j=1;j<=2*n;j++)
			f[j][i]=f[f[j][i-1]][i-1];
}
void go(int x)
{
	int i,op=x,ans=1;
	for(i=19;i>=0;i--)
	{
		if((f[op][i]>0)&&(lan[f[op][i]].r<lan[x].l+m))
		{
			printf("%d\n",ans);
			ans+=(1<<i);
			op=f[op][i];
		}
	}
	yan[lan[x].id]=ans+1;
}
int main()
{
	//freopen("flag.in","r",stdin);
	//freopen("flag.out","w",stdout);
	int i,j;
	scanf("%d%d",&n,&m);
	for(i=1;i<=n;i++)
	{
		scanf("%d%d",&lan[i].l,&lan[i].r);
		if(lan[i].r<lan[i].l)lan[i].r+=m;
		lan[i].id=i;
	}
	sort(lan+1,lan+n+1,cmp);
	for(i=1;i<=n;i++)
	{
		lan[i+n]=lan[i];
		lan[i+n].l+=m;
		lan[i+n].r+=n;
	}
	dfs();
	for(i=1;i<=n;i++)
	{
		printf("%d ",f[i][1]);
	}
	printf("\n");
	for(i=1;i<=n;i++)
		go(i);
	for(i=1;i<=n;i++)
		printf("%d ",yan[i]);
	return 0;
}
2025/7/2 15:20
加载中...