POJ 4048 金华赛区E题
这题算是给自己敲了个警钟,模板必须高度可靠,原来我在各个OJ都能过题的模板,在现场塞被卡的很惨。。。
算法导论上的模板才是王道啊。。。(就差那么一点,就就,唉~~~~~~~~~~~~~~~~~)从此以后再不相信网上各种模板了。
还是贴代码吧。
#include<iostream>
#include<cstdio>
#include<algorithm>
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define MAXN 1504
typedef double datatype;
using namespace std;
//typedef complex<double> point;
struct point {
datatype x, y;
point(){}
point(datatype _x, datatype _y):x(_x),y(_y){}
point(const point &temp)
{
x = temp.x;
y = temp.y;
}
}fir[MAXN],sec[MAXN];
datatype cmp(datatype x)
{
if (x > 0)return 1;
if (x < 0)return -1;
return 0;
}
point start,end;
datatype cross(const point &p1, const point &p2, const point &q1, const point &q2)
{
return cmp((q2.y - q1.y)*(p2.x - p1.x) - (q2.x - q1.x)*(p2.y - p1.y));
}
bool on_seg(const point &p1, const point &p2, const point &q)
{
if (min(p1.x,p2.x) <= q.x && q.x <= max(p1.x,p2.y) &&
min(p1.y,p2.y) <= q.y && q.y <= max(p1.y,p2.y) && cross(p1,p2,p1,q) == 0) {
return true;
}
return false;
}
bool intersect(const point &p1, const point &p2, const point &q1, const point &q2)
{
if (cross(p1,q1,p1,p2)*cross(p1,p2,p1,q2) > 0 && cross(q1,p1,q1,q2)*cross(q1,q2,q1,p2) > 0)
return true;
return on_seg(p1,p2,q1) || on_seg(p1,p2,q2) || on_seg(q1,q2,p1) || on_seg(q1,q2,p2);
}
int get_cnt(int i, int n)
{
int temp(1);
for (int j(0); j<n; ++j) {
if (i == j)continue;
if (intersect(start,end,fir[j],sec[j]))++temp;
}
return temp;
}
void get_end(const point &p)
{
end.x = start.x + (p.x - start.x)*100000.0;
end.y = start.y + (p.y - start.y)*100000.0;
}
int main()
{
int t;
cin>>t;
while (t--) {
int n;
cin>>n;
for (int i(0); i<n; ++i) {
cin>>fir[i].x>>fir[i].y>>sec[i].x>>sec[i].y;
}
cin>>start.x>>start.y;
int cnt(1);
for (int i(0); i<n; ++i) {
get_end(fir[i]);
cnt = max(cnt,get_cnt(i,n));
get_end(sec[i]);
cnt = max(cnt,get_cnt(i,n));
}
cout<<cnt<<endl;
}
return 0;
}
浙公网安备 33010602011771号