結果
| 問題 |
No.245 貫け!
|
| コンテスト | |
| ユーザー |
wing3196
|
| 提出日時 | 2015-07-17 23:14:53 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 5,157 bytes |
| コンパイル時間 | 736 ms |
| コンパイル使用メモリ | 92,304 KB |
| 実行使用メモリ | 6,948 KB |
| 最終ジャッジ日時 | 2024-07-08 09:28:40 |
| 合計ジャッジ時間 | 1,839 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | WA * 4 |
| other | AC * 1 WA * 15 |
ソースコード
#define _USE_MATH_DEFINES
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<climits>
#include<string>
#include<vector>
#include<list>
#include<map>
#include<set>
#include<cmath>
#include<queue>
#include<cstring>
#include<stack>
#include<functional>
#include<deque>
#include<cstdlib>
#include<ctime>
using namespace std;
#define EPS 1e-8
#define INF 1000000
struct Point{
double x,y;
Point(){}
Point(double _x,double _y){
x=_x; y=_y;
}
Point operator +(const Point p)const{
return Point(x+p.x,y+p.y);
}
Point operator -(const Point p)const{
return Point(x-p.x,y-p.y);
}
Point operator *(const double d)const{
return Point(x*d,y*d);
}
bool operator <(const Point &p)const{
if(x==p.x) return y<p.y;
return x<p.x;
}
bool operator ==(const Point &p)const{
return abs(x-p.x)<EPS && abs(y-p.y)<EPS;
}
double norm(){
return x*x+y*y;
}
bool input(){
if(cin>>x>>y) return true;
return false;
}
};
struct Line{
Point a,b;
Line(){}
Line(Point _a,Point _b){
a=_a; b=_b;
}
bool input(){
if(a.input() && b.input()) return true;
return false;
}
};
struct Circle{
Point c;
double r;
Circle(){}
Circle(Point _c,double _r){
c=_c; r=_r;
}
};
typedef Point Vector;
typedef vector<Point> Polygon;
typedef Line Segment;
double dot(Point p,Point q){
return p.x*q.x+p.y*q.y;
}
double cross(Point p,Point q){
return p.x*q.y-q.x*p.y;
}
int ccw(Point a,Point b,Point c){ //a,b,c,は全て異なる
Vector v1 = b-a;
Vector v2 = c-a;
if(cross(v1,v2)>EPS) return +1; //a->b->c が反時計回り
if(cross(v1,v2)<-EPS) return -1; //a->b->c が時計回り
if(dot(v1,v2)<-EPS) return +2; //cがa-bより後ろ c<-a->b
if(v2.norm()-v1.norm()>EPS) return -2; //cがa-bより前 a->b->c
return 0; //cがa-b上 a->c->b
}
Point project(Segment s,Point p){
Vector v1 = s.b-s.a;
Vector v2 = p-s.a;
double r = dot(v1,v2)/v1.norm();
return s.a+v1*r;
}
Point reflect(Segment s,Point p){
return p+(project(s,p)-p)*2.0;
}
bool intersect_ll(Line l,Line m){
return ccw(l.a,l.b,m.a)*ccw(l.a,l.b,m.b)<=0 && ccw(m.a,m.b,l.a)*ccw(m.a,m.b,l.b)<=0;
}
bool crosspoint_ss(Segment s,Segment t,Point &p){
Vector a1,a2,b1,b2;
a1 = s.b-s.a; a2 = t.b-t.a;
b1 = t.a-s.a; b2 = s.a-t.b;
double s1,s2;
s1 = cross(a1,b1)/2; s2 = cross(a1,b2)/2;
if(s1+s2<EPS) return false; //平行
p = Point(t.a.x+a2.x*s1/(s1+s2),t.a.y+a2.y*s1/(s1+s2));
return true;
}
int crosspoint_ll(Line l,Line m,Point &p){
if(intersect_ll(l,m)==false) return 0; //交差していない
if(crosspoint_ss(l,m,p)==true) return 1;
return -1; //交点が無限個(平行かつ交差)
}
bool intersect_sl(Segment s, Line t){
Point p(10000, 10000);
if( crosspoint_ll(s, t, p) == 0 ) return false;
if( ( ( ( (p - s.a).x < EPS && (p - s.a).y < EPS ) || ( (p - s.b).x < EPS && (p - s.b).y < EPS ) ) || ccw(s.a, s.b, p) == 0 )
&& ( ( ( (p - t.a).x < EPS && (p - t.a).y < EPS ) || ( (p - t.b).x < EPS && (p - t.b).y < EPS ) ) || abs( ccw(t.a, t.b, p) ) != 1 ) )
return true;
return false;
}
int crosspoint_cc(Circle c1,Circle c2,Point &p1,Point &p2){
double d,a,t;
d = sqrt((c2.c-c1.c).norm());
if(abs(c1.c.x-c2.c.x)<EPS && abs(c1.c.y-c2.c.y)<EPS && abs(c1.r-c2.r)<EPS)
return -1; //2つの円が重なっている
if(d<abs(c1.r-c2.r) || c1.r+c2.r<d) return 0; //離れているか内包
a = acos((c1.r*c1.r+d*d-c2.r*c2.r)/(2*c1.r*d));
t = atan2(c2.c.y-c1.c.y,c2.c.x-c1.c.x);
p1 = Point(c1.c.x+c1.r*cos(t+a),c1.c.y+c1.r*sin(t+a));
p2 = Point(c1.c.x+c1.r*cos(t-a),c1.c.y+c1.r*sin(t-a));
if(abs(p1.x-p2.x)<EPS && abs(p1.y-p2.y)<EPS) return 1; //交点が1つ
return 2; //交点が2つ
}
//多角形の点の内包
int contain_gp(Polygon g,Point p){
Line l = Line(p,Point(INF,p.y));
int cnt = 0, n = g.size();
for(int i=0;i<n;i++){
Vector a = g[i]-p;
Vector b = g[(i+1)%n]-p;
if(ccw(g[i],g[(i+1)%n],p)==0) return 1; //線分上
if(a.y>b.y) swap(a,b);
if(a.y<=EPS && EPS<b.y && cross(a,b)>EPS) cnt++;
}
if((cnt&1)==1) return 2; //内包している
return 0; //内包していない
}
Polygon andrewScan(Polygon s){
if(s.size()<=2) return s;
sort(s.begin(),s.end());
Polygon g;
for(int i=0;i<s.size();i++){
for(int n=g.size(); n>=2 && ccw(g[n-2],g[n-1],s[i])!=-1; n--){
g.pop_back();
}
g.push_back(s[i]);
}
int upper_n = g.size();
for(int i=s.size()-2;i>=0;i--){
for(int n=g.size(); n>upper_n && ccw(g[n-2],g[n-1],s[i])!=-1; n--){
g.pop_back();
}
g.push_back(s[i]);
}
reverse(g.begin(),g.end());
g.pop_back();
return g;
}
int N;
Line l[100];
int Count(Line m){
int cnt = 0;
for(int i = 0; i < N; i++){
if( intersect_sl(l[i], m) ) cnt++;
}
return cnt;
}
int main(){
cin >> N;
for(int i = 0; i < N; i++) l[i].input();
int ans = 0;
vector<Point> p;
for(int i = 0; i < N; i++){
p.push_back(l[i].a); p.push_back(l[i].b);
}
for(int i = 0; i < p.size(); i++){
for(int j = i+1; j < p.size(); j++){
ans = max( ans, Count( Line(p[i], p[j]) ) );
}
}
printf("%d\n", ans);
}
wing3196