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