CF249D 题解
Francais_Drake · · 题解
题意
坐标系上给出
解法
考虑把两个点的斜率用另一种方式表示:
定义向量
同时令原点为
代码
#include <bits/stdc++.h>
using namespace std;
const int maxn=100010;
int n,i,a,b,c,d,x,y;
struct Vals{
long long val;
int idx;
inline bool operator <(const Vals &p)const{return val<p.val;}
}A[maxn],B[maxn];
struct node{
int ra,rb;
inline bool operator <(const node &p)const{
if(ra!=p.ra) return ra<p.ra;
return rb<p.rb;
}
}N[maxn];
int C[maxn],dp[maxn];
inline void Add(int p,const int &v){
for(;p<maxn;p+=(p&-p)) C[p]=max(C[p],v);
}
inline int Que(int p){
int ret=0;
for(;p;p&=(p-1)) ret=max(ret,C[p]);
return ret;
}
long long lst;
int main(){
scanf("%d",&n);
scanf("%d/%d%d/%d",&a,&b,&c,&d);
for(i=1;i<=n;++i){
scanf("%d%d",&x,&y);
A[i].idx=B[i].idx=i;
B[i].val=(1LL*y*b)-(1LL*x*a);
A[i].val=(1LL*x*c)-(1LL*y*d);
}
sort(A+1,A+n+1);sort(B+1,B+n+1);
for(i=1;A[i].val<=0;++i);
x=1;lst=A[i].val;
for(;i<=n;++i){
while(A[i].val==lst) N[A[i++].idx].ra=x;
lst=A[i].val;N[A[i].idx].ra=++x;
}
for(i=1;B[i].val<=0;++i);
x=1;lst=B[i].val;
for(;i<=n;++i){
while(B[i].val==lst) N[B[i++].idx].rb=x;
lst=B[i].val;N[B[i].idx].rb=++x;
}
sort(N+1,N+n+1);x=1;a=0;
for(i=1;!N[i].ra;++i);
for(;i<=n;++i){
if(N[i].ra!=N[x].ra) for(;x<i;++x) if(N[x].rb) Add(N[x].rb,dp[x]);
if(N[i].rb) a=max(a,dp[i]=Que(N[i].rb-1)+1);
}
printf("%d",a);
return 0;
}