tozangezan's diary

勝手にソースコードをコピペして利用しないでください。

Codeforces Round #352 (Div. 1)

心が折れた。
灰コーダー並みの注意力だったのも悪いけど、サンプルも弱いし罠も多すぎだと思う。

A B C D E Place
00:28 (+1) 00:14 (+2) -5 - - 105th

A:
嫌なケースが多すぎる。returnを忘れた。

#include<stdio.h>
#include<math.h>
#include<algorithm>
#include<queue>
#include<string.h>
#include<vector>
#include<set>
#include<map>
#include<stdlib.h>
using namespace std;
const long long mod=1000010007;
const long long inf=mod*mod;
double x[3];
double y[3];
double X[110000];
double Y[110000];
double dist(double dx,double dy){
	return sqrt(dx*dx+dy*dy);
}
pair<double,int> ta[110000];
pair<double,int> tb[110000];
int main(){
	for(int i=0;i<3;i++){
		scanf("%lf%lf",x+i,y+i);
	}
	int a;scanf("%d",&a);
	for(int i=0;i<a;i++){
		scanf("%lf%lf",X+i,Y+i);
	}
	if(a==1){
		printf("%.12f\n",min(dist(X[0]-x[0],Y[0]-y[0]),dist(X[0]-x[1],Y[0]-y[1]))+dist(X[0]-x[2],Y[0]-y[2]));
		return 0;
	}
	double ret=0;
	for(int i=0;i<a;i++){
		ret+=dist(X[i]-x[2],Y[i]-y[2])*2;
		ta[i]=make_pair(dist(X[i]-x[0],Y[i]-y[0])-dist(X[i]-x[2],Y[i]-y[2]),i);
		tb[i]=make_pair(dist(X[i]-x[1],Y[i]-y[1])-dist(X[i]-x[2],Y[i]-y[2]),i);
	}
	double ad=99999999999999.9;
	std::sort(ta,ta+a);
	std::sort(tb,tb+a);
	for(int i=0;i<2;i++)for(int j=0;j<2;j++){
		if(ta[i].second==tb[j].second)continue;
		ad=min(ta[i].first+tb[j].first,ad);
	}
	ad=min(ad,min(ta[0].first,tb[0].first));
	printf("%.12f\n",ret+ad);
}

B:
奇数のときは最小1とかいう明確な罠。

#include<stdio.h>
#include<math.h>
#include<algorithm>
#include<queue>
#include<string.h>
#include<vector>
#include<set>
#include<map>
#include<stdlib.h>
using namespace std;
const long long mod=1000010007;
const long long inf=mod*mod;
int c[510000];
int main(){
	int a,b;
	scanf("%d%d",&a,&b);
	long long sum=0;
	for(int i=0;i<a;i++){
		scanf("%d",c+i);
		sum+=c[i];
	}
	std::sort(c,c+a);
	int left=0;
	int right=mod;
	while(left+1<right){
		int M=(left+right)/2;
		long long cur=0;
		for(int i=0;i<a;i++){
			if(c[i]<M)cur+=M-c[i];
		}
		if(b<cur){
			right=M;
		}else left=M;
	}
	int q1=left;
	left=0;
	right=mod;
	while(left+1<right){
		int M=(left+right)/2;
		long long cur=0;
		for(int i=0;i<a;i++){
			if(c[i]>M)cur+=c[i]-M;
		}
		if(b<cur){
			left=M;
		}else right=M;
	}
	int q2=right;
	if(q1>q2)q1=q2;
	if(q2-q1==0&&sum%a)q2++;
	printf("%d\n",q2-q1);
}

C:
二重に誤読していた。が解けるものには見えない。