【问题描述】
“我是超级大沙茶”——Mato_No1
为了证明自己是一个超级大沙茶,Mato 神犇决定展示自己对叉(十字型)有多么的了
解。
Mato 神犇有一个平面直角坐标系,上面有一些线段,保证这些线段至少与一条坐标轴
平行。Mato 神犇需要指出,这些线段构成的最大的十字型有多大。
称一个图形为大小为 R(R 为正整数)的十字型,当且仅当,这个图形具有一个中心点,
它存在于某一条线段上,并且由该点向上下左右延伸出的长度为 R 的线段都被已有的线段
覆盖。
你可以假定:没有两条共线的线段具有公共点,没有重合的线段。
【输入格式】
第一行,一个正整数 N,代表线段的数目。
以下 N 行,每行四个整数 x1,y1,x2,y2(x1=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%的数据:N≤1000。
对于 100%的数据:1≤N≤100000,所有坐标的范围在-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