読者です 読者をやめる 読者になる 読者になる

メモ

yukicoderで遊んでいる競プロゆるふわ勢

yukicoder No.406 鴨等間隔の法則

問題はこちら
No.406 鴨等間隔の法則 - yukicoder

定義どおりやるだけ
ソートして、その間隔が一定かつ0でないことを確かめれば良い

c(int*a,int*b){return *a-*b;}
int main(){
	int x,a[1<<17],s,i,n,f;
	scanf("%d",&n);
	for(i=0;i<n;i++)scanf("%d",a+i);
	qsort(a,n,4,c);
	f=1;
	s=a[1]-a[0];
	for(i=1;i<n;i++)if(a[i]-a[i-1]!=s)f=0;
	puts(f==0||s==0?"YES":"NO");
	return 0;
}

読み込みはいつもどおりやるとして問題は初期化
よく考えると

s=0;
for(i=1;i<n;i++){
	if(s!=0&&a[i]-a[i-1]!=s)f=0;
	s=a[i]-a[i-1];
}

という感じで困るのはサンプル3のような「間隔が全て0」のときだけなので、代入をうまくループ終了条件のところにぶち込んで

x,a[1<<17],s;
c(int*a,int*b){x=*a-*b;}
main(i){
	for(;~scanf("%d",a-i);i--);
	for(qsort(a,-i,4,c);++i&&s==(x=a[-i]-a[~i])|!s?s=x:0;);
	x=!puts(i?"NO":"YES");
}

150B