kmjp's blog

競技プログラミング参加記です

Codeforces #284 Div1 A. Crazy Town

CF283に参加。
ABCと解いたもののBで若干TLEするコードを書いたせいでレート減。
http://codeforces.com/contest/498/problem/A

問題

2次元座標上で、N個の直線ax+by+c=0が与えられる。
(x1,y1)から(x2,y2)に移動するとき、最小何個の直線をまたぐ必要があるか。

解法

ax+by+cに(x1,y1)及び(x2,y2)を代入し、符号が片方正片方負なら、その直線はまたぐ必要がある。

ll X[2],Y[2];
int N;
ll A[1000],B[1000],C[1000];

void solve() {
	int i,j,k,l,r,x,y; string s;
	
	cin>>X[0]>>Y[0];
	cin>>X[1]>>Y[1];
	cin>>N;
	
	x=0;
	FOR(i,N) {
		cin>>A[i]>>B[i]>>C[i];
		ll aa=A[i]*X[0]+B[i]*Y[0]+C[i];
		ll bb=A[i]*X[1]+B[i]*Y[1]+C[i];
		if(aa<0 && bb>0) x++;
		if(aa>0 && bb<0) x++;
	}
	cout<<x<<endl;
	
}

まとめ

これはあっさり。