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

比赛的时候搜到了最接近点对的求法 Nlog(N) 又估摸着依次插入求的话会TLE 想了想觉得可以先把最近的位置求出来 然后后面的直接不用求了 依次直到减完 又觉得可能会有变态的数据每次最近的都在最后面 没敢写。。后来 发现它出现在题解的方法三中。。

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <cmath>
  5. #include <algorithm>
  6. using namespace std;
  7. #define N 500005
  8. #define LL long long
  9. #define INF 1000000000000000000
  10. int mm;
  11. LL d;
  12. struct Point
  13. {
  14. LL x;
  15. LL y;
  16. int p;
  17. }point[N],tt[N];
  18. int tmpt[N];
  19.  
  20. bool cmpxy(const Point& a, const Point& b)
  21. {
  22. if(a.x != b.x)
  23. return a.x < b.x;
  24. return a.y < b.y;
  25. }
  26. bool cmpy(const int& a, const int& b)
  27. {
  28. return point[a].y < point[b].y;
  29. }
  30.  
  31. LL min(LL a, LL b)
  32. {
  33. return a < b ? a : b;
  34. }
  35.  
  36. LL dis(int i, int j)
  37. {
  38. return (point[i].x-point[j].x)*(point[i].x-point[j].x)
  39. + (point[i].y-point[j].y)*(point[i].y-point[j].y);
  40. }
  41. void Closest_Pair(int left, int right)
  42. {
  43. if(left==right)
  44. {
  45. return ;
  46. }
  47. if(left + == right)
  48. {
  49. LL xx = dis(left, right);
  50. if(d>xx)
  51. {
  52.  
  53. d = xx;
  54. mm = max(point[left].p,point[right].p);
  55. }
  56. return ;
  57. }
  58. int mid = (left+right)>>;
  59. Closest_Pair(left,mid);
  60. Closest_Pair(mid+,right);
  61. int i,j,k=;
  62. for(i = left; i <= right; i++)
  63. {
  64. if((point[mid].x-point[i].x)*(point[mid].x-point[i].x) <= d)
  65. tmpt[k++] = i;
  66. }
  67. sort(tmpt,tmpt+k,cmpy);
  68. for(i = ; i < k; i++)
  69. {
  70. for(j = i+; j < k && (point[tmpt[j]].y-point[tmpt[i]].y)*(point[tmpt[j]].y-point[tmpt[i]].y)<d; j++)
  71. {
  72. LL d3 = dis(tmpt[i],tmpt[j]);
  73. if(d > d3)
  74. {
  75. d = d3;
  76. mm = max(point[tmpt[j]].p,point[tmpt[i]].p);
  77. }
  78. }
  79. }
  80. }
  81. int main()
  82. {
  83. int t,a[],i;
  84. cin>>t;
  85. while(t--)
  86. {
  87. for(i = ; i <= ; i++)
  88. cin>>a[i];
  89. point[i].x = ;
  90. point[i].y = ;
  91. for(i = ; i <= a[] ; i++)
  92. {
  93. point[i].x = (point[i-].x*a[]+a[])%a[];
  94. point[i].y = (point[i-].y*a[]+a[])%a[];
  95. point[i].p = i;
  96. tt[i].x = point[i].x;
  97. tt[i].y = point[i].y;
  98. tt[i].p = i;
  99. }
  100. LL s=;
  101. int n = a[];
  102. while()
  103. {
  104. sort(point+,point+n+,cmpxy);
  105. d = INF;
  106. Closest_Pair(,n);
  107. s+=(n-mm+)*d;
  108. n = mm-;
  109. for(i = ; i <= n ; i++)
  110. {
  111. point[i].x = tt[i].x;
  112. point[i].y = tt[i].y;
  113. point[i].p = tt[i].p;
  114. }
  115. if(n<=)
  116. break;
  117. }
  118. cout<<s<<endl;
  119. }
  120. return ;
  121. }

hdu4631Sad Love Story(多校3)(最接近点对)的更多相关文章

  1. 2017 多校4 Security Check

    2017 多校4 Security Check 题意: 有\(A_i\)和\(B_i\)两个长度为\(n\)的队列过安检,当\(|A_i-B_j|>K\)的时候, \(A_i和B_j\)是可以同 ...

  2. hdu6074[并查集+LCA+思维] 2017多校4

    看了标答感觉思路清晰了许多,用并查集来维护全联通块的点数和边权和. 用另一个up[]数组(也是并查集)来保证每条边不会被重复附权值,这样我们只要将询问按权值从小到大排序,一定能的到最小的边权和与联通块 ...

  3. 【2019多校第一场补题 / HDU6578】2019多校第一场A题1001Blank——dp

    HDU6578链接 题意 有一串字符串,仅由 {0,1,2,3}\{0, 1, 2, 3\}{0,1,2,3} 组成,长度为 nnn,同时满足 mmm 个条件.每个条件由三个整数组成:l.r.xl.r ...

  4. NOIP模拟92&93(多校26&27)

    前言 由于太菜了,多校26 只改出来了 T1 ,于是直接并在一起写啦~~~. T0 NOIP 2018 解题思路 第一次考场上面写三分,然而我并不知道三分无法处理不是严格单峰的情况,但凡有一个平台都不 ...

  5. 【开源毕设】一款精美的家校互动APP分享——爱吖校推 [你关注的,我们才推](持续开源更新3)附高效动态压缩Bitmap

    一.写在前面 爱吖校推如同它的名字一样,是一款校园类信息推送交流平台,这么多的家校互动类软件,你选择了我,这是我的幸运.从第一次在博客园上写博客到现在,我一次一次地提高博文的质量和代码的可读性,都是为 ...

  6. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  7. P1774 最接近神的人_NOI导刊2010[树状数组 逆序对 离散化]

    题目描述 破解了符文之语,小FF开启了通往地下的道路.当他走到最底层时,发现正前方有一扇巨石门,门上雕刻着一幅古代人进行某种活动的图案.而石门上方用古代文写着“神的殿堂”.小FF猜想里面应该就有王室的 ...

  8. NTP校时设置

    一.Windows Server 2008 – Time Server 前言: 国家时间与频率标准实验室  && NTP服务器 也可以忽略1~6 直接跳7 如果已改过机码请使用 1   ...

  9. 2016暑假多校联合---Rikka with Sequence (线段树)

    2016暑假多校联合---Rikka with Sequence (线段树) Problem Description As we know, Rikka is poor at math. Yuta i ...

随机推荐

  1. 跟着PHP100第一季学写一个CMS(1-10)

    笔记: 这次用的方法是先跟着视频做一遍,隔一天或半天后独立再做一遍,能发现真正不会的地方记录下来. CMS0.1界面布局1.问题:分两个css来实现时basic.css+index.php出现定位不正 ...

  2. VLAN和Trunk

    Vlan实验题: 如图所示 解答过程 (一)相同vlan之间的设备全连通 1. 在SW1和SW2上分别创建vlan2和vlan3, 命令如下 SW1# vlan database SW1(vlan)# ...

  3. Nat网络地址转换

    Nat中的术语 -------------------------------------------------------------------------------------------- ...

  4. Django文档——Model字段类型(Field Types)

    大部分内容参考自http://wrongwaycn.github.io/django11/topics/db/models/index.html#topics-db-models ,内容是django ...

  5. 帝国cms中 内容分页的SEO优化

    关于内容页如果存在分页的话,我们想区分第一页和后面数页,当前的通用做法是在标题上加入分页码,帝国cms中如何做到呢.我们可以修改在e/class/functions.php中的源码.找到找到GetHt ...

  6. NEV_SDK开发环境部署手册

    根据项目开发需求,要在MEC服务器上部署如下内容:Nginx.Nginx push stream module.Jason CPP.Spawn-fcgi.libfcgi.Redis.Hiredis.B ...

  7. MySQL日期和时间函数

    WEEKDAY( date ) 返回date的星期索引( = 星期天 ) . mysql> select WEEKDAY( '1997-10-04 22:23:00' ) ; mysql> ...

  8. LINQ to XML学习笔记

    一.XML基础知识 1.XML:可扩展标记语言 Extensible Markup Language ,提供了一种保存数据的格式,数据可以通过这种格式很容易地在不同的应用程序之间实现共享. 2.使用X ...

  9. Mac 启用http-dav功能(WebDAV服务器)

    启用Mac的WebDAV可以实现文件的上传以及Windows.Linux和Mac之间的数据互传. 客户端使用:windows下使用网上邻居 --> 添加一个网上邻居  --> 输入uplo ...

  10. 【BZOJ 1951】 [Sdoi2010]古代猪文

    Description “在那山的那边海的那边有一群小肥猪.他们活泼又聪明,他们调皮又灵敏.他们自由自在生活在那绿色的大草坪,他们善良勇敢相互都关心……” ——选自猪王国民歌 很久很久以前,在山的那边 ...