hdu 4631 Sad Love Story 多校第三场

来源:互联网 发布:丽新网络盒子 编辑:程序博客网 时间:2024/06/08 18:36

用一个set保存所有点,按照x排序的顺序,然后根据插入点离x从远到近更新结果,一旦不可能更新了就跳掉。

没想到这么暴力也可以过。。。

#include <set>#include <cstdio>#include <cstring>#include <string>#include <iostream>#include <algorithm>#include <iterator>#include <map>#include <cmath>#include <cstdlib>using namespace std;typedef __int64 lld;typedef pair<lld,lld> PII;#define MP(a,b) make_pair((a),(b))#define inf 12345678912345678LLset<pair<lld,lld> >s;int main(){    int T;    scanf("%d",&T);    while(T--)    {        lld n,ax,bx,cx,ay,by,cy;        s.clear();        scanf("%I64d %I64d %I64d %I64d %I64d %I64d %I64d",&n,&ax,&bx,&cx,&ay,&by,&cy);        lld x=0,y=0,xi,yi;        xi=(x*ax+bx)%cx;        yi=(y*ay+by)%cy;        x=xi,y=yi;        s.insert(MP(x,y));        lld res=0;        lld ans=inf;        for(int i=1;i<n;i++)        {            set<PII>::iterator it,tm;            xi=(x*ax+bx)%cx;            yi=(y*ay+by)%cy;            if(s.count(MP(xi,yi))) break;            s.insert(MP(xi,yi));            it=s.lower_bound(MP(xi,yi));            for(tm=it,tm++;tm!=s.end();tm++)            {                lld tx=(*tm).first,ty=(*tm).second;                if((tx-xi)*(tx-xi)>=ans) break;                else                {                    lld tmp=((tx-xi)*(tx-xi)+(ty-yi)*(ty-yi));                    if(ans>tmp) ans=tmp;                }            }            for(tm=it,tm--;it!=s.begin();tm--)            {                lld tx=(*tm).first,ty=(*tm).second;                if((xi-tx)*(xi-tx)>=ans) break;                else                {                    lld tmp=((tx-xi)*(tx-xi)+(ty-yi)*(ty-yi));                    if(ans>tmp) ans=tmp;                }                if(tm==s.begin()) break;            }            x=xi,y=yi;            res+=ans;        }        cout<<res<<endl;    }    return 0;}


原创粉丝点击