【JZOJ4221】互相追逐的點

description

某天,某個平面上的N個點想做一個遊戲。它們每個點都有一個這N個點中最喜歡的點。從某個時刻起,這N個點都向自己最喜歡的點方向以恆定的1單位/秒的速率移動,直至與它最喜歡的點距離爲1或與它最喜歡的點的距離在某一秒內保持不變,在此之後它將與它最喜歡的點的運動方向保持一致。特別地,如果某時刻某個點與它最喜歡的點重疊,它這個時刻將不會移動。
現在,第N+1個點想知道這N個點做遊戲的情況,但是由於它沒有多少內存,你只需要告訴它經過足夠長(你可以認爲是無限長)的時間後任意一組不知道向哪裏移動的點就可以了。一個點不知道向哪裏移動,當且僅當它的移動方向只決定於它自己的移動方向,且與它自己的移動方向一致;如果一個點不知道向哪裏移動,它將不再移動。
例如,如果第1個點初始在(0,0),第2個點初始在(2,0),第3個點初始在(0,2),第4個點初始在(4,0),第5個點初始在(3,6),第1個點最喜歡第2個點,第2個點最喜歡第3個點,第3個點最喜歡第1個點,第4個點最喜歡第2個點,第5個點最喜歡第4個點,那麼0.1s後這5個點的座標分別約爲(0.051,0.000),(1.975,0.025),(0.001,1.949),(3.950,0.000),(3.003,5.984),0.5s後分別約爲(0.279,0.010),(1.861,0.129),(0.019,1.733),(3.742,0.008),(3.012,5.918),1.0s後約爲(0.655,0.061),(1.684,0.271),(0.099,1.433),(3.472,0.035),(3.020,5.833),約1.04s時第1個點與第2個點距離爲1,第1個點開始與第2個點的運動方向保持一致。約1.4s時5個點座標分別約爲(0.513,0.186),(1.490,0.399),(0.210,1.139), (3.252,0.070),(3.025,5.764),第3個點與第1個點距離爲1,第3個點開始與第1個點運動方向(也就是第2個點運動方向)保持一致。過了1s(即約2.4s時),5個點座標分別約爲(-0.072,0.524),(0.905,0.737),(-0.376,1.477), (2.724,0.199),(3.023,5.584),這1s內第2個點和第3個點的距離保持不變,所以第2個點開始與第3個點運動方向(也就是第2個點運動方向)保持一致。從此,第2個點不知道向哪裏移動。與此同時,第1個點與第2個點運動方向也就是第3個點運動方向也就是第1個點運動方向保持一致,所以第1個點也不知道向哪裏移動。第3個點與第1個點運動方向也就是第2個點運動方向也就是第3個點運動方向保持一致,所以第3個點也不知道向哪裏移動。
一些不知道向哪裏移動的點可以被稱爲“一組”,當且僅當:它們雖然不知道向哪裏移動(而且不會移動),但它們如果運動則運動方向一定保持一致,而且不存在某個不屬於這些點的不知道向哪裏移動的點使得這些點加上這一個點仍然如果運動則運動方向一定保持一致。例如,在上述例子中第1、2、3個點可以被稱爲一組,而第1、2個點不能被稱爲一組。注意:如果一個點的移動方向只決定於一個不知道向哪裏移動的點的移動方向,那麼不能說這個點也不知道向哪裏移動(很不科學是吧=_=)。
點忽略體積,移動時可以重疊而不互相影響。


analysis

  • 這題是道傻逼題,即使題面很玄

  • 對於一些在一個環上面的點,這些點一定是逐漸互相靠近直到滿足條件

  • 所以就是輸出一個環


code

#pragma GCC optimize("O3")
#pragma G++ optimize("O3")
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define MAXN 200005
#define ll long long
#define reg register ll
#define fo(i,a,b) for (reg i=a;i<=b;++i)
#define fd(i,a,b) for (reg i=a;i>=b;--i)
#define O3 __attribute__((optimize("-O3")))

using namespace std;

ll a[MAXN],b[MAXN],pre[MAXN];
bool bz[MAXN];
ll n,tot;

O3 inline ll read()
{
	ll x=0,f=1;char ch=getchar();
	while (ch<'0' || '9'<ch){if (ch=='-')f=-1;ch=getchar();}
	while ('0'<=ch && ch<='9')x=x*10+ch-'0',ch=getchar();
	return x*f;
}
O3 int main()
{
	//freopen("T2.in","r",stdin);
	n=read();
	fo(i,1,n)a[i]=read();
	memset(bz,1,sizeof(bz));
	for (reg i=1;;i=a[i])
	{
		if (bz[a[i]])bz[a[i]]=0,pre[a[i]]=i;
		else
		{
			b[tot=1]=i;
			ll temp=a[i];
			while (i!=temp)
			{
				i=pre[i];
				b[++tot]=i;
			}
			break;
		}
	}
	printf("%lld\n",tot);
	fo(i,1,tot)printf("%lld ",b[i]);
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章