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;
}

  

posted on 2012-05-12 23:36  Dev-T  阅读(310)  评论(3编辑  收藏  举报