社区讨论

c++0pts求调

P4155[SCOI2015] 国旗计划参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@lz8bqr7m
此快照首次捕获于
2024/07/30 19:18
2 年前
此快照最后确认于
2024/07/30 20:39
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
const int N=4e5+10;
struct S
{
	int x;
	int y;
}a[N];
S w[N];
int n,m;
int Next[N];
int f[N][30];
bool operator <(const S &q,const S &p)
{
	return q.x<p.x;
}
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;
		if(y<x)
		y+=m;
		w[i].x=x;
		w[i].y=y;
	}
	for(int i=1;i<=n;i++)
	{
		a[i]=w[i];
		a[i+n].x=w[i].x+m;
		a[i+n].y=w[i].y+m;
	}
	sort(a+1,a+1+n);
	
	n*=2;
	for(int i=1,tot=i;i<=n;i++)
	{
		while(tot<=n&&a[tot].x<=a[i].y)
			tot++;
		f[i][0]=tot-1;
	}
	for(int j=1;j<=20;j++)
	{
		for(int i=1;i<=n;i++)
		{
			f[i][j]=f[f[i][j-1]][j-1];
		}
	}
	for(int i=1;i<=n/2;i++)
	{
		int ans=1;
		int L=w[i].x;
		int R=L+m;
		int Now=i;
//		cout<<'#'<<f[Now][0]<<endl;
		for(int j=20;j>=0;j--)
		{
			if(f[Now][j]!=0&&a[f[Now][j]].y<R)
			{
				ans+=(1<<j);
				Now=f[Now][j];
			}
		}
		cout<<ans+1<<' ';
	}
	return 0;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...