首页 > 其他 > 详细

镇海中学 NOIp 2014 模拟赛 T2: Super Big Stupid Cross解题报告

时间:2018-07-14 13:47:37      阅读:309      评论:0      收藏:0      [点我收藏+]

Super Big Stupid Cross

问题描述】

“我是超级大沙茶”——Mato_No1
为了证明自己是一个超级大沙茶,Mato 神犇决定展示自己对叉(十字型)有多么的了
解。
Mato 神犇有一个平面直角坐标系,上面有一些线段,保证这些线段至少与一条坐标轴
平行。Mato 神犇需要指出,这些线段构成的最大的十字型有多大。
称一个图形为大小为 RR 为正整数)的十字型,当且仅当,这个图形具有一个中心点,
它存在于某一条线段上,并且由该点向上下左右延伸出的长度为 R 的线段都被已有的线段
覆盖。
你可以假定:没有两条共线的线段具有公共点,没有重合的线段。
【输入格式】
第一行,一个正整数 N,代表线段的数目。
以下 N 行,每行四个整数 x1,y1,x2,y2x1=x2 y1=y2),描述了一条线段。
【输出格式】
当不存在十字型时:输出一行“Human intelligence is really terrible”(不包括引号)。
否则:输出一行,一个整数,为最大的 R
【样例输入 1】
1 0
0 0 1
【样例输出 1】
Human intelligence is really terrible
【样例输入 2】
3
-1 0 5 0
0 -1 0 1
2 -2 2 2
【样例输出 2】
2
【数据规模与约定】
对于 50%的数据:N1000
对于 100%的数据:1N100000,所有坐标的范围在-10^9~10^9 中。
50%内,所有数据均为随机生成。


【思路】

据说这道题正解是平衡树加二分……然而我是蒟蒻嘛??才不会呢~所以……我们采用一种特别的方法……神级的暴力!当然这个暴力加了一种十分神奇的操作!!!(☆▽☆)是什么呢?啊!我们先看代码!(正在看这篇的你:??

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<cmath>
  5 #include<algorithm>
  6 #define MAXN 100005
  7 using namespace std;
  8 int n,r=-1;
  9 
 10 inline void getnum(int &num)
 11 {
 12     num=0;
 13     int f=1;
 14     char c=getchar();
 15     while (!isdigit(c))
 16     {
 17         if (c==-)
 18             f=-1;
 19         c=getchar();
 20     }
 21     while (isdigit(c))
 22     {
 23         num=(num<<3)+(num<<1)+c-0;
 24         c=getchar();
 25     }
 26     num*=f;
 27     return;
 28 }
 29 
 30 struct Segment
 31 {
 32     int len,xl,xr,yu,yd;
 33     bool transe;
 34 }seg[MAXN];
 35 
 36 inline void add_seg(int num,int xa,int ya,int xb,int yb)
 37 {
 38     int l;
 39     if (xa==xb)
 40     {
 41         l=abs(ya-yb);
 42         seg[num].len=l;
 43         if (ya>yb)
 44             seg[num].yu=ya,seg[num].yd=yb;
 45         else
 46             seg[num].yu=yb,seg[num].yd=ya;
 47         seg[num].xr=seg[num].xl=xa;
 48         seg[num].transe=0;
 49     }
 50     else
 51     {
 52         l=abs(xa-xb);
 53         seg[num].len=l;
 54         if (xa>xb)
 55             seg[num].xr=xa,seg[num].xl=xb;
 56         else
 57             seg[num].xr=xb,seg[num].xl=xa;
 58         seg[num].yu=seg[num].yd=ya;
 59         seg[num].transe=1;
 60     }
 61     return;
 62 }
 63 
 64 inline bool cmp(Segment a,Segment b)
 65 {
 66     return a.len>b.len;
 67 }
 68 
 69 int main()
 70 {
 71     freopen("cross.in","r",stdin);
 72     freopen("cross.out","w",stdout);
 73     getnum(n);
 74     for (register int i=1;i<=n;i++)
 75     {
 76         int xa,ya,xb,yb;
 77         getnum(xa),getnum(ya),getnum(xb),getnum(yb);
 78         add_seg(i,xa,ya,xb,yb);
 79     }
 80     sort(seg+1,seg+1+n,cmp);
 81     for (register int i=1;i<=n;i++)
 82     {
 83         for (register int j=i+1;j<=n;j++)
 84         {
 85             if (seg[j].len/2<r)
 86                 break;
 87             if (seg[i].transe==seg[j].transe)
 88                 continue;
 89             if (seg[i].transe)
 90             {
 91                 if (seg[i].xr<=seg[j].xl||seg[i].xl>=seg[j].xr)
 92                     continue;
 93                 if (seg[j].yu<=seg[i].yd||seg[j].yd>=seg[i].yu)
 94                     continue;
 95                 int xmid=seg[j].xl,ymid=seg[i].yu;
 96                 r=max(r,min(min(xmid-seg[i].xl,seg[i].xr-xmid),min(seg[j].yu-ymid,ymid-seg[j].yd)));
 97             }
 98             else
 99             {
100                 if (seg[i].yu<=seg[j].yd||seg[i].yd>=seg[j].yu)
101                     continue;
102                 if (seg[j].xr<=seg[i].xl||seg[j].xl>=seg[i].xr)
103                     continue;
104                 int xmid=seg[i].xl,ymid=seg[j].yu;
105                 r=max(r,min(min(xmid-seg[j].xl,seg[j].xr-xmid),min(seg[i].yu-ymid,ymid-seg[i].yd)));
106             }
107         }
108     }
109     if (r<=0)
110         printf("Human intelligence is really terrible\n");
111     else
112         printf("%d\n",r);
113     return 0;
114 }

 

怎么这么长……这不重要!恶魔妈妈买面膜……重点……就在85行!……还有……80行!这里我们把len/2小于已求得的r

镇海中学 NOIp 2014 模拟赛 T2: Super Big Stupid Cross解题报告

原文:https://www.cnblogs.com/oycy0306/p/9309380.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!