QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#386326#5809. Min PerimeterKonvex20 ✓9945ms87660kbC++142.5kb2024-04-11 15:32:272024-04-11 15:32:27

Judging History

你现在查看的是最新测评结果

  • [2024-04-11 15:32:27]
  • 评测
  • 测评结果:20
  • 用时:9945ms
  • 内存:87660kb
  • [2024-04-11 15:32:27]
  • 提交

answer

#include<bits/stdc++.h>
using namespace std;
#define N 1000100
struct vec{
	int x,y;
};
int n;
vec a[N];
double dist(vec a,vec b){
	double x=a.x-b.x,y=a.y-b.y;
	return sqrt(x*x+y*y);
}
double calc(vec a,vec b,vec c){
	return dist(a,b)+dist(b,c)+dist(c,a);
}
namespace h{
	struct node{
		int xid,yid,nxt;
	}d[N<<1];
	int head[N],tot=1;
	vector<int> vis;
	vector<int> dt[N];
	void clear(){
		for(int id:vis){
			int u=head[id];head[id]=0;
			while(u){
				dt[u].clear();dt[u].shrink_to_fit();
				int v=d[u].nxt;
				d[u].xid=d[u].yid=d[u].nxt=0;
				u=v;
			}
		}
		vis.clear();tot=1;
	}
	int zget(double x){
		if(x>=0)return (int)x;
		else return -(int)(-x)-1;
	}
	int getnode(int xid,int yid){
		long long hsh=((1LL*xid*1145141919LL+yid)%N+N)%N;
		int u=head[hsh];
		while(u){
			if(d[u].xid==xid&&d[u].yid==yid){
				return u;
			}
			u=d[u].nxt;
		}
		return -1;
	}
	void insert(int idx,double C){
		vec z=a[idx];
		int xid=zget(z.x/C),yid=zget(z.y/C);
		long long hsh=((1LL*xid*1145141919LL+yid)%N+N)%N;
		int u=getnode(xid,yid);
		if(u==-1){
			int u=tot++;d[u].xid=xid;d[u].yid=yid;d[u].nxt=head[hsh];
			if(!d[u].nxt)vis.push_back(hsh);
			head[hsh]=u;dt[u].push_back(idx);
		}else{
			dt[u].push_back(idx);
		}
	}
};
void build(double C,int m){
	h::clear();
	for(int i=1;i<=m;i++){
		h::insert(i,C);
	}
}
int dir[9][2]={
	{-1,-1},{-1,0},{-1,1},{0,-1},{0,0},{0,1},{1,-1},{1,0},{1,1}
};
vector<int> tmp;
int work(int tid){
	//freopen("triangle.in","r",stdin);
	//freopen("triangle.out","w",stdout);
	h::clear();tmp.clear();
	scanf("%d",&n);
	for(int i=1;i<=n;i++)scanf("%d%d",&(a[i].x),&(a[i].y));
	random_shuffle(a+1,a+n+1);
	double ans=calc(a[1],a[2],a[3]);
	build(ans/2,3);
	//printf("init ans=%lf\n",ans);
	for(int i=4;i<=n;i++){
		if(ans<1e-6)break;
		int xid=h::zget(a[i].x/(ans/2)),yid=h::zget(a[i].y/(ans/2));
		tmp.clear();
		for(int j=0;j<9;j++){
			int nx=xid+dir[j][0],ny=yid+dir[j][1];
			int id=h::getnode(nx,ny);if(id==-1)continue;
			for(int idx:h::dt[id]){
				if(dist(a[i],a[idx])<ans/2)tmp.push_back(idx);
			}
		}
		double tans=ans;
		for(int j=0;j<tmp.size();j++){
			for(int k=j+1;k<tmp.size();k++){
				tans=min(tans,calc(a[i],a[tmp[j]],a[tmp[k]]));
			}
		}
		if(tans+1e-9<ans){
			//printf("ans=%lf,tans=%lf\n",ans,tans);
			ans=tans;
			build(ans/2,i);
		}else{
			h::insert(i,ans/2);
		}
	}
	printf("Case #%d: %lf\n",tid,ans);
	return 0;
}
int main(){
	int t;scanf("%d",&t);
	for(int i=1;i<=t;i++)work(i);
}

詳細信息

Subtask #1:

score: 5
Accepted

Test #1:

score: 5
Accepted
time: 46ms
memory: 35160kb

input:

15
3
2 6
7 0
3 0
3
713 269
371 79
455 421
3
91983245 637281504
756917015 312173515
869576338 436726680
10000
14761642 78236002
9047458 47951098
5238002 27761162
476182 2523742
1428546 7571226
26190010 138805810
21904372 116092132
18094916 95902196
43332562 229660522
55237112 292754072
52380020 27761...

output:

Case #1: 17.893012
Case #2: 1042.844835
Case #3: 1711142102.791327
Case #4: 90912.296374
Case #5: 3.414214
Case #6: 26.153830
Case #7: 1701.012681
Case #8: 2865438.191994
Case #9: 2020088.337226
Case #10: 1792106.037292
Case #11: 2019352.542910
Case #12: 2530195.728018
Case #13: 930517.779631
Case #...

result:

ok correct! (15 test cases)

Subtask #2:

score: 15
Accepted

Test #2:

score: 15
Accepted
time: 9945ms
memory: 87660kb

input:

15
3
501691275 344354353
167768963 536043860
249445040 557426549
4
1000000000 0
0 0
1000000000 1000000000
0 1000000000
1000000
138925776 669369648
61257680 295150640
170762328 822763944
55483472 267329456
97736936 470914328
84041848 404928904
18463588 88960924
124429360 599523280
95066048 458045504
...

output:

Case #1: 799653579.133090
Case #2: 3414213562.373095
Case #3: 866.071591
Case #4: 62459.895370
Case #5: 59141.918359
Case #6: 898195.090968
Case #7: 1707085.769987
Case #8: 1686.226798
Case #9: 1686.603546
Case #10: 6806.665584
Case #11: 1907363.078325
Case #12: 1798829.537861
Case #13: 2000000.4819...

result:

ok correct! (15 test cases)

Extra Test:

score: 0
Extra Test Passed