HDOJ 4631 Sad Love Story

STL+暴力

Sad Love Story

Time Limit: 40000/20000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)
Total Submission(s): 1583    Accepted Submission(s): 498


Problem Description
There's a really sad story.It could be about love or about money.But love will vanish and money will be corroded.These points will last forever.So this time it is about points on a plane.
We have a plane that has no points at the start.
And at the time i,we add point p i(x i, y i).There is n points in total.
Every time after we add a point,we should output the square of the distance between the closest pair on the plane if there's more than one point on the plane.
As there is still some love in the problem setter's heart.The data of this problem is randomly generated.
To generate a sequence x 1, x 2, ..., x n,we let x 0 = 0,and give you 3 parameters:A,B,C. Then x i = (x i-1 * A + B) mod C.
The parameters are chosen randomly.
To avoid large output,you simply need output the sum of all answer in one line.
 

Input
The first line contains integer T.denoting the number of the test cases.
Then each T line contains 7 integers:n A x B x C x A y B y C y.
A x,B x,C x is the given parameters for x 1, ..., x n.
A y,B y,C y is the given parameters for y 1, ..., y n.
T <= 10. 
n <= 5 * 10 5.
10 4 <= A,B,C <= 10 6.
 

Output
For each test cases,print the answer in a line.
 

Sample Input
   
   
   
   
2 5 765934 377744 216263 391530 669701 475509 5 349753 887257 417257 158120 699712 268352
 

Sample Output
   
   
   
   
8237503125 49959926940
Hint
If there are two points coincide,then the distance between the closest pair is simply 0.
 


#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <set>

using namespace std;

typedef long long int LL;
typedef pair<LL,LL> pII;

int T_T,n;
LL A[2],B[2],C[2],pre_x,pre_y;

LL get_next(LL x,int kind)
{
    ///0...x   1...y
    return (x*A[kind]+B[kind])%C[kind];
}

LL get_dist(LL x1,LL y1,LL x2,LL y2)
{
    return (x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);
}

int main()
{
    scanf("%d",&T_T);
while(T_T--)
{
    scanf("%d%I64d%I64d%I64d%I64d%I64d%I64d",&n,A,B,C,A+1,B+1,C+1);

    LL ans=0,mindist=0x3f3f3f3f3f3f3f3fLL;
    set<pII> st;

    pre_x=get_next(0LL,0);
    pre_y=get_next(0LL,1);
    st.insert(make_pair(pre_x,pre_y));

	set<pII>::iterator it,pos,item;

    for(int i=2;i<=n;i++)
    {
        LL X,Y;
        X=get_next(pre_x,0);
        Y=get_next(pre_y,1);
		pos=st.lower_bound( make_pair(X,Y) );
		for(it=pos;it!=st.begin();)
		{
		    it--;
			if(((X-(*it).first)*(X-(*it).first))>=mindist) break;
			else mindist=min(mindist,get_dist(X,Y,(*it).first,(*it).second));
		}
		for(it=pos;it!=st.end();it++)
		{
			if(((X-(*it).first)*(X-(*it).first))>=mindist) break;
			else mindist=min(mindist,get_dist(X,Y,(*it).first,(*it).second));
		}
		pre_x=X,pre_y=Y;
		st.insert(make_pair(X,Y));
        ans+=mindist;
    }
    printf("%I64d\n",ans);
}
	return 0;
}




你可能感兴趣的:(HDOJ 4631 Sad Love Story)