http://acm.hdu.edu.cn/showproblem.php?pid=4631

题意: 在平面内依次加点,求每次加点后最近点对距离平方的和

因为是找平面最近点对...所以加点以后这个最短距离一定是递减的...所以最后会形成这样一个函数图像

所以我们只要从后往前依次删点即可...

15秒惊险水过...不过我最小点对的木板肯定写挂了,卡时限的话估计过不了...

请用G++交...C++会TLE...当然我也无法解释这个问题...估计是我傻逼

/********************* Template ************************/
#include <set>
#include <map>
#include <list>
#include <cmath>
#include <ctime>
#include <deque>
#include <queue>
#include <stack>
#include <bitset>
#include <cstdio>
#include <string>
#include <vector>
#include <cassert>
#include <cstdlib>
#include <cstring>
#include <sstream>
#include <fstream>
#include <numeric>
#include <iomanip>
#include <iostream>
#include <algorithm>
#include <functional>
using namespace std;#define EPS         1e-8
#define MAXN        (int)5e5+5
#define MOD         (int)1e9+7
#define PI          acos(-1.0)
#define INF         ((1LL)<<50)
#define max(a,b)    ((a) > (b) ? (a) : (b))
#define min(a,b)    ((a) < (b) ? (a) : (b))
#define max3(a,b,c) (max(max(a,b),c))
#define min3(a,b,c) (min(min(a,b),c))
#define BUG         cout<<"BUG! "<<endl
#define LINE        cout<<"------------------"<<endl
#define L(t)        (t << 1)
#define R(t)        (t << 1 | 1)
#define Mid(a,b)    ((a + b) >> 1)
#define lowbit(a)   (a & -a)
#define FIN         freopen("out.txt","w",stdout)
#pragma comment     (linker,"/STACK:102400000,102400000")// typedef long long LL;
// typedef unsigned long long ULL;
typedef __int64 LL;
// typedef unisigned __int64 ULL;
// int gcd(int a,int b){ return b?gcd(b,a%b):a; }
// int lcm(int a,int b){ return a*b/gcd(a,b); }/*********************   F   ************************/
struct point
{LL x,y;int pos;int id;point(double a = 0,double b = 0,int c = 0){x = a ; y = b ; pos = c;}
}p[MAXN],t[MAXN],tmp[MAXN];LL n,ax,bx,cx,ay,by,cy;bool cmp(point a,point b){if(a.x == b.x) return a.y < b.y;return a.x < b.x;
}bool cmp1(point a,point b){return a.y < b.y;
}LL dist(point a ,point b){return (a.x-b.x) * (a.x-b.x) + (a.y-b.y) * (a.y-b.y);
}/**  二维空间找最近点对*  返回排序后点位置的pair<int,int>*/
pair<int,int> Closest_Pair(int l ,int r){if(l == r || l+1 == r) return make_pair(l,r); //1个点,2个点 直接return;int m = Mid(l,r);       // (l+r)/2pair<int,int> dl = Closest_Pair(l,m);pair<int,int> dr = Closest_Pair(m+1,r);LL ldis,rdis;       //左部分的最值 右部分的最值LL ans_dis;         //左中右三部分最值if(dl.first == dl.second) ldis = INF;   //判重else ldis = dist(p[dl.first],p[dl.second]);if(dr.first == dr.second) rdis = INF;else rdis = dist(p[dr.first],p[dr.second]);pair<int,int> ans = ldis < rdis ? dl : dr ; //左右两部分的最值点对ans_dis = min(ldis,rdis);                   //左右两部分的最值// 从中向左右两边找在[p[m].x-d,p[m].x+d]的平面内所有点// 这以后的复杂度就不太好估计了...// 这段模板是用暴力找的...我只做了一点点优化...但为什么加剪枝时间还多了这我不太理解囧int cnt = 0;
//    for(int i = l; i <= r; i++)
//    {
//        if((long long)(p[m].x - p[i].x)*(p[m].x - p[i].x) <= ans_dis)
//            tmp[cnt++] = p[i];
//    }for(int i = m ; i >= l ; i--){LL q = (p[m].x - p[i].x) * (p[m].x - p[i].x);if(p[i].x < p[m].x - q) break;if(q <= ans_dis){tmp[cnt++] = p[i];}}for(int i = m+1 ; i <= r ; i++){LL q = (p[m].x - p[i].x) * (p[m].x - p[i].x);if(p[i].x > p[m].x + q) break;if(q <= ans_dis){tmp[cnt++] = p[i];}}//按y方向进行筛选 ,相隔大于d的点可以直接跳过sort(tmp,tmp+cnt,cmp1);for(int i = 0 ; i < cnt ; i++){for(int j = i+1 ; j < cnt ; j++){if((tmp[i].y - tmp[j].y) * (tmp[i].y - tmp[j].y) >= ans_dis)break;if(dist(tmp[i],tmp[j]) < ans_dis){ans_dis = dist(tmp[i],tmp[j]);ans = make_pair(tmp[i].id,tmp[j].id);}}}return ans;
}void pre(){t[0].x = bx % cx;t[0].y = by % cy;t[0].pos = 0;for(int i = 1 ; i <= n ; i++) {t[i].x = (t[i-1].x * ax + bx) % cx;t[i].y = (t[i-1].y * ay + by) % cy;t[i].pos = i;}
}
int main()
{//FIN;int T;scanf("%d",&T);while(T--){scanf("%d%I64d%I64d%I64d%I64d%I64d%I64d",&n,&ax,&bx,&cx,&ay,&by,&cy);pre();LL res  = 0 ;while(n){for(int i = 0 ; i < n ; i++)p[i] = t[i];sort(p,p+n,cmp);for(int i = 0 ; i < n ; i++)p[i].id = i;pair<int,int> ans = Closest_Pair(0,n-1);int last = max(p[ans.first].pos,p[ans.second].pos);res += (dist(p[ans.first],p[ans.second]) * (n - last));n = last ;}printf("%I64d\n",res);}return 0;
}

转载于:https://www.cnblogs.com/Felix-F/p/3231376.html

HDU 4631 Sad Love Story 平面内最近点对相关推荐

  1. 利用kd树进行平面内最近点搜索

    要求: 对平面内每一个点都找到离它最近的点.通常想法是knn,那么由于是对n个点求,直接算的话就是n平方. 我们利用kd树来搜索,那么复杂度就变为了nlogn,甚至说由于a与b距离最小等价于b与a最小 ...

  2. HDU 6681(树状数组统计平面内射线的交点个数)

    HDU 6681(树状数组,统计平面内射线的交点个数) 题目链接:传送门 题意:给出k条射线,求射线将n∗mn*mn∗m 的区域分成几个联通块.每两条射线的端点x坐标和y坐标都互不相同. 思路:根据 ...

  3. 平面内两条线段的位置关系(相交)判定与交点求解

    http://www.cnblogs.com/devymex/archive/2010/08/19/1803885.html 概念 平面内两条线段位置关系的判定在很多领域都有着广泛的应用,比如游戏.C ...

  4. c语言 两条线段位置,C++/STL实现判断平面内两条线段的位置关系代码示例

    概念 平面内两条线段位置关系的判定在很多领域都有着广泛的应用,比如游戏.CAD.图形处理等,而两线段交点的求解又是该算法中重要的一环.本文将尽可能用通俗的语言详细的描述一种主流且性能较高的判定算法. ...

  5. 单缝孔径平面内移动_傅里叶变换解夫琅禾费衍射问题的几个例子_3

    单缝孔径平面内移动 一.解夫琅禾费衍射 二.现象分析 三.用到的傅里叶变换 一.解夫琅禾费衍射 条件: 单缝夫琅禾费衍射 入射光:单色平面波,单位振幅,垂直入射 衍射孔径:单缝,缝宽:a,缝长:无限长 ...

  6. PCL点云处理之平面内两直线求交点(五十)

    PCL点云处理之平面内两直线求交点(五十) 一.两点求直线 二.两直线求交点 二.代码 一.两点求直线 设两个点为 (x1, y1) , (x2, y2),则有: A = y2 - y1 B = x1 ...

  7. 位置关系C语言,C++/STL实现判断平面内两条线段的位置关系代码示例

    概念 平面内两条线段位置关系的判定在很多领域都有着广泛的应用,比如游戏.CAD.图形处理等,而两线段交点的求解又是该算法中重要的一环.本文将尽可能用通俗的语言详细的描述一种主流且性能较高的判定算法. ...

  8. 如何判断一个点是否落在一个平面内

    最近有个朋友问起的一个问题,给定一个荷质比和保留时间构成的平面,想看下哪些化合物落在这个平面里面. 假如有下面一个平面,哪些点在平面里?哪些点在平面外?怎么判断呢? 最简单的方法是目测! 如果采用程序 ...

  9. 在平面内,已知矩形的中心点坐标、长、宽和倾斜角度,求矩形四个角点的坐标

    实现思路: 1.已知矩形的中心点坐标.长和宽,求矩形在不旋转的情况下矩形的四个顶点坐标: 2.再求按逆时针旋转一定角度后的四个点坐标: (在平面内,已知一个矩形的四个角坐标,将矩形绕中心点转动一个角度 ...

最新文章

  1. 大促下的智能运维挑战:阿里如何抗住“双11猫晚”?
  2. 为什么程序员不擅长评估开发时间?(转)
  3. ctf-cybrics
  4. python如何安装wordcloud_不知如何利用Python中wordcloud的安装和使用?这里手把手教你...
  5. (转)Singleton 单例模式(懒汉方式和饿汉方式)
  6. ffplay常用命令
  7. JMP二次开发方法研究
  8. stvd watch 实时变量查看
  9. lnmp 升级php后 502 bad gateway,lnmp 运行一段时间后出现nginx 502 Bad Gateway的解决方法...
  10. Vue中使用v-if判断某个元素满足多个条件的简约写法-案例
  11. 超写实虚拟人制作教程
  12. 制造业原材料价格上涨 安防设备涨还是不涨?
  13. python中24≤2825是否合法_在下列Python语句中非法的是() (2.0分)_学小易找答案
  14. 8.12 纪中集训 Day12
  15. 虚拟服务器 补丁,两种方法为VMware ESXi打补丁
  16. 8255 并行接口实验
  17. 华为5c_华为5c手机价格及产品参数配置【图文】
  18. Perl正则表达式讲解
  19. 基于用户标签的活跃人群特征分析_基于用户行为模型的客流量分析与预测
  20. Python-matplotlib画图要点【大总结】

热门文章

  1. 如何从零开始开发一款嵌入式产品(20年的嵌入式经验分享学习)
  2. 小波阈值去噪法基础理论
  3. windows中 修改某种文件图标 的方法 (备忘)
  4. 【Android 修炼手册】Gradle 篇 -- Android Gradle Plugin 主要流程分析
  5. 798·锣鼓巷·牛街
  6. 自然哲学的数学原理_物理起源点,牛顿《自然哲学的数学原理》
  7. sql 统计记录条数后 打印出所有记录_用SQL完成购买行为分析(下篇II)
  8. xshell搭建宝塔没有远程命令密码框框弹出来_服务器安装宝塔控制面板+wordpress搭建个人网站...
  9. 服务器点播直播系统,服务器点播直播系统
  10. linux爬365租房没有数据,新手求助,LINUX下安装11G不能MOUNT数据库