RE求助
查看原帖
RE求助
542390
wumingwei楼主2024/7/30 15:18
#include<bits/stdc++.h>
using namespace std;
const int N=4e5+10;
struct S
{
	int x;
	int y;
}a[N],w[N];
map<int,int> Map;
int n,m,tot;
int Next[2];
int f[N][30];
bool operator <(const S &q,const S &p)
{
	if(q.x!=p.x)
	return q.x<p.x;
	else
	return q.y<p.y;
}
void er()
{
	for(int i=1;i<=tot;i++)
	{
//		cout<<"*"<<a[i].x<<' '<<a[i].y<<endl;
		Map[a[i].y]=i;
	}
	for(int i=1;i<=tot;i++)
	{
		int l=i+1,r=tot,mid;
		while(l<r)
		{
			mid=(l+r+1)>>1;
			if(a[mid].x<=a[i].y)
			{
				l=mid;
			 } 
			else
			{
				r=mid-1;
			}
		}
		Next[i]=l;
	}
}
int main()
{
//	std::ios::sync_with_stdio(false);
//	cin.tie(0);
//	cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		int x,y;
		cin>>x>>y;
		w[i].x=x;
		w[i].y=y;
		if(y<=x)
		{
			S W;
			W.x=x;
			W.y=y+m;
			a[++tot]=W;
		}
		else
		{
			S W;
			W.x=x;
			W.y=y;
			a[++tot]=W;
			W.x=x+m;
			W.y=y+m;
			a[++tot]=W;
		}
	}
	sort(a+1,a+1+tot);
	er();
//	cout<<"$$$"<<Next[2]<<endl;
	for(int i=1;i<=tot;i++)
	{
		f[i][0]=a[i].y;
	}
	for(int j=1;j<=24;j++)
	{
		for(int i=1;i+(1<<j)-1<=n;i++)
		{
			f[i][j]=max(f[i][j-1],f[i+(1<<(j-1))][j-1]);
		}
	}
	for(int i=1;i<=n;i++)
	{
		
		int ans=0;
		int L=w[i].x,R=w[i].x+m;
//		cout<<"R:"<<R<<endl; 
		int l=i+1,r=Next[i];
		int k=log2(r-l+1);
		int MAX;
		do
		{
//			cout<<"max:"<<max(f[l][k],f[r-(1<<k)+1][k])<<endl;
			MAX=Map[max(f[l][k],f[r-(1<<k)+1][k])];
			l=MAX+1,r=Next[MAX];
//			cout<<"r:"<<r<<endl;
			k=log2(r-l+1);
//			cout<<"MAX:"<<MAX<<endl;
//			cout<<endl;
			ans++;
		}while(a[MAX].y<R);
		cout<<ans+1<<' ';
	}
	return 0;
}
2024/7/30 15:18
加载中...