K - Anton and Lines CodeForces - 593B

K - Anton and Lines CodeForces - 593B

思路

求出两个边界处,每条线对应的 y,如果出现(y1i - y1j)* (y2i - y2j) < 0, 则相交
复杂度分析 : n2, 1e10 超时了
优化 : 对一边排序(从上到下 1,2,3,…), 如果另一边出现 b1 < b2 则交叉

错误代码

node p[100005] 爆内存了,把 node 中的 k, b 去掉

#include<bits/stdc++.h>
using namespace std;
#define ll long long

struct node{
	ll k, b;
	ll y1, y2;
};

bool cmp(node a, node b) {
	if(a.y1 == b.y1) return a.y2 > b.y2;
	return a.y1 > b.y1;
}

int main() {
	freopen("test.in", "r", stdin);
	ll n, x1, x2, flag;
	while(cin >> n) {
		flag = 0;
		node p[100005];
		cin >> x1 >> x2;
		for(int i = 1; i <= n; i++) {
			cin >> p[i].k >> p[i].b;
			p[i].y1 = p[i].k*x1 + p[i].b;
			p[i].y2 = p[i].k*x2 + p[i].b;
		}
		sort(p+1, p+n+1, cmp);
		for(int i = 1; i < n; i++) {//比较相邻两项即可,复杂度从 O(n^2) -> O(n) 
			if(p[i].y2 < p[i+1].y2) {
				flag = 1;
				break;
			}
		}
		if(!flag) cout << "NO" << endl;
		else cout << "YES" << endl;
	}
	return 0;
}

修改后代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long

struct node{
	ll y1, y2;
};

bool cmp(node a, node b) {
	if(a.y1 == b.y1) return a.y2 > b.y2;
	return a.y1 > b.y1;
}

int main() {
	freopen("test.in", "r", stdin);
	ll n, x1, x2, flag, k, b;
	while(cin >> n) {
		flag = 0;
		node p[100005];
		cin >> x1 >> x2;
		for(int i = 1; i <= n; i++) {
			cin >> k >> b;
			p[i].y1 = k*x1 + b;
			p[i].y2 = k*x2 + b;
		}
		sort(p+1, p+n+1, cmp);
		for(int i = 1; i < n; i++) {//比较相邻两项即可,复杂度从 O(n^2) -> O(n) 
			if(p[i].y2 < p[i+1].y2) {
				flag = 1;
				break;
			}
		}
		if(!flag) cout << "NO" << endl;
		else cout << "YES" << endl;
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值