Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

Re:自己拍了上百组大数据都没错,但是死活WA

Posted by zhuowenliang at 2023-12-20 17:23:58 on Problem 3714
In Reply To:自己拍了上百组大数据都没错,但是死活WA Posted by:wjzcom at 2017-05-11 18:13:38
> //poj 3714 分治  TLE
> #include<string>
> #include<cstring>
> #include<cmath>
> #include<cstdio>
> #include<cstdlib>
> #include<iostream>
> #include<algorithm>
> #define ll long long
> using namespace std;
> 
> const int MAXN = 100000 + 10;
> const int INF = 0x3f3f3f3f;
> int n, s;
> double ans;
> int mid, cnta, cnts;
> 
> struct node
> {
> 	ll x, y;
> } pa[MAXN];   //agent
> node ps[MAXN];    //station
> 
> node tempa[MAXN];
> node temps[MAXN];
> 
> double dist(node a, node b)
> {
> 	double ans = sqrt((double)((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)));
> 	return ans;	
> }
> 
> bool cmp(node a, node b)
> {
> 	if(a.x == b.x) return a.y < b.y;
> 	else return a.x < b.x;
> }
> 
> bool cmpy(node a, node b)
> {
> 	return a.y < b.y;
> }
> 
> double jue(int a)
> {
> 	if(a >= 0) return a;
> 	else return -a;
> }
> 
> double solve(int lt, int rt)
> {
> 	mid = (lt + rt) >> 1;
> 	ans = INF;
> 	
> 	if(lt == rt) return ans;
> 	if(lt+1 == rt) return min(dist(pa[lt], ps[rt]), dist(ps[lt], pa[rt]));
> 	
> 	ans = min(solve(lt, mid), solve(mid, rt));
> 	
> 
> 	cnta = 0, cnts = 0;
> 	for(int i = lt; i <= rt; i++)
> 	{
> 		if(jue(pa[mid].x-pa[i].x) <= ans) tempa[++cnta] = pa[i];
> 		if(jue(ps[mid].x-ps[i].x) <= ans) temps[++cnts] = ps[i];
> 	}
> 	
> //	sort(tempa+1, tempa+1+cnta, cmpy);
> //	sort(temps+1, temps+1+cnts, cmpy);
> 	
> 	for(int i = 1; i <= cnta; i++)
> 		for(int j = 1; j <= cnts; j++)
> 		{
> //			if(jue((temps[j].y - tempa[i].y)) > ans) break;
> 			ans = min(ans, dist(pa[i], ps[j]));
> 		}
> 	
> 	return ans;	
> }
> 
> int main()
> {
> 	cin >> s;
> 	while(s--)
> 	{
> 		memset(pa, 0, sizeof(pa));
> 		memset(ps, 0, sizeof(ps));
> 		
> 		cin >> n;
> 		for(int i = 1; i <= n; i++) cin >> pa[i].x >> pa[i].y;
> 		for(int i = 1; i <= n; i++) cin >> ps[i].x >> ps[i].y;
> 		
> 		sort(pa+1, pa+1+n, cmp);
> 		sort(ps+1, ps+1+n, cmp);
> 		
> 		double res = solve(1, n);
> 		printf("%.3f\n", res);		
> 	}
> 	return 0;
> } 

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator