记录编号 453360 评测结果 AAAAAAAAAA
题目名称 [HAOI 2007]覆盖问题 最终得分 100
用户昵称 GravatarTroywar 是否通过 通过
代码语言 C++ 运行时间 0.331 s
提交时间 2017-09-21 12:47:14 内存使用 0.72 MiB
显示代码纯文本
  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<algorithm>
  5. using namespace std;
  6. typedef long long ll;
  7. const ll inf=(ll)1e11+1;
  8. inline ll read(){
  9. ll s=0,k=1;char ch=getchar();
  10. while(ch<'0'||ch>'9') k=ch=='-'?-k:k,ch=getchar();
  11. while(ch>47&&ch<='9') s=s*10+(ch^48),ch=getchar();
  12. return s*k;
  13. }
  14. const int N=20020;
  15. struct Point{
  16. ll x,y;
  17. friend bool operator<(Point a,Point b){
  18. return a.x!=b.x?a.x<b.x:a.y<b.y;
  19. }
  20. inline void in(){
  21. x=read(),y=read();
  22. }
  23. }point[N];
  24. inline bool cmp(Point a,Point b){
  25. return a.y<b.y;
  26. }
  27. int n;
  28. bool vis[N];
  29. bool ne[4][N];
  30. inline bool dfs(int direction,int step,ll x){
  31. if(step==4){
  32. for(int i=1;i<=n;i++)
  33. if(!vis[i]) return false;
  34. return true;
  35. }
  36. ll r,l,up,down;
  37. r=up=-inf;
  38. l=down=inf;
  39. for(int i=1;i<=n;i++){
  40. if(!vis[i]){
  41. r=max(r,point[i].x);
  42. l=min(l,point[i].x);
  43. up=max(up,point[i].y);
  44. down=min(down,point[i].y);
  45. }
  46. }
  47. if(up-down<=x&&r-l<=x) return true;
  48. else if(step==3)
  49. return false;
  50. else {
  51. if(direction==1){
  52. for(int i=1;i<=n;i++){
  53. if(!vis[i])
  54. if(point[i].x-l<=x&&up-point[i].y<=x)
  55. vis[i]=ne[step][i]=true;
  56. }
  57. for(int i=1;i<=4;i++)
  58. if(dfs(i,step+1,x))
  59. return true;
  60. for(int i=1;i<=n;i++){
  61. if(ne[step][i])
  62. vis[i]=ne[step][i]=false;
  63. }
  64. }else if(direction==2){
  65. for(int i=1;i<=n;i++){
  66. if(!vis[i])
  67. if(point[i].x-l<=x&&point[i].y-down<=x)
  68. vis[i]=ne[step][i]=true;
  69. }
  70. for(int i=1;i<=4;i++)
  71. if(dfs(i,step+1,x))
  72. return true;
  73. for(int i=1;i<=n;i++){
  74. if(ne[step][i])
  75. vis[i]=ne[step][i]=false;
  76. }
  77. }else if(direction==3){
  78. for(int i=1;i<=n;i++){
  79. if(!vis[i])
  80. if(r-point[i].x<=x&&point[i].y-down<=x)
  81. vis[i]=ne[step][i]=true;
  82. }
  83. for(int i=1;i<=4;i++)
  84. if(dfs(i,step+1,x))
  85. return true;
  86. for(int i=1;i<=n;i++){
  87. if(ne[step][i])
  88. vis[i]=ne[step][i]=false;
  89. }
  90. }else{
  91. for(int i=1;i<=n;i++){
  92. if(!vis[i])
  93. if(r-point[i].x<=x&&up-point[i].y<=x)
  94. vis[i]=ne[step][i]=true;
  95. }
  96. for(int i=1;i<=4;i++)
  97. if(dfs(i,step+1,x))
  98. return true;
  99. for(int i=1;i<=n;i++){
  100. if(ne[step][i])
  101. vis[i]=ne[step][i]=false;
  102. }
  103. }
  104. }
  105. return false;
  106. }
  107. inline bool Judge(ll x){
  108. for(int i=1;i<=4;i++){
  109. memset(vis,0,sizeof(vis));
  110. if(dfs(i,1,x))
  111. return true;
  112. }return false;
  113. }
  114. int main(){
  115. freopen("cover.in","r",stdin);
  116. freopen("cover.out","w",stdout);
  117. //printf("%lld\n",inf);
  118. scanf("%d",&n);
  119. for(int i=1;i<=n;i++)
  120. scanf("%lld%lld",&point[i].x,&point[i].y);
  121. sort(point+1,point+n+1);
  122. for(int i=n;i;i--){
  123. point[i].x-=point[1].x,point[i].y-=point[1].y;
  124. }
  125. ll l=-1,r=2000000100ll;
  126. while(l<r-1){
  127. ll mid=l+r>>1;
  128. if(Judge(mid)) r=mid;
  129. else l=mid;
  130. }
  131. printf("%ld\n",r);
  132. }