记录编号 204107 评测结果 AAAAAAAAAA
题目名称 [SYOI 2015] Asm.Def的一秒 最终得分 100
用户昵称 Gravatarmikumikumi 是否通过 通过
代码语言 C++ 运行时间 0.276 s
提交时间 2015-11-03 21:35:33 内存使用 5.65 MiB
显示代码纯文本
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<deque>
using namespace std;
const int SIZEN=100010,INF=0x7fffffff/2;
typedef long long LL;
int N;
LL a,b,c,d;
int f[2*SIZEN]={0};
class poi
{
public:
	LL x,y;
	int id;
}P[2*SIZEN];
bool cmp(poi a,poi b)
{
	if(a.x==b.x) return a.y<b.y;
	return a.x<b.x;
}
int tr[SIZEN*2]={0};
void read()
{
	scanf("%d",&N);
	scanf("%d%d%d%d",&a,&b,&c,&d);
	for(int i=1;i<=N;i++)
	{
		scanf("%d%d",&P[i].x,&P[i].y);
		P[i].id=i;
	}
	P[0].x=0,P[0].y=0;P[0].id=0;
}
void set()
{
	//cout<<a<<" "<<b<<" "<<c<<" "<<d<<endl;
	for(int i=1;i<=N;i++)
	{
		int x=P[i].x,y=P[i].y;
		P[i].x=c*x-d*y;
		P[i].y=b*y-a*x;
		P[i].x*=(-1);P[i].y*=(-1);
	}
}
int lowbit(int x)
{
	return x&(-x);
}
void add(int x,int y)
{
	//cout<<x<<" "<<y<<endl;
	for(int i=x;i<=N+1;i+=lowbit(i)) tr[i]=max(tr[i],y);
}
int get(int x)
{
	int ans=0;
	for(int i=x;i>0;i-=lowbit(i)) ans=max(ans,tr[i]);
	return ans;
}
void DP()
{
	for(int i=0,j=0;i<=N;i++)
	{
		while(P[j].x<P[i].x)
		{
			//cout<<i<<" "<<j<<endl;
			add(P[j].y,f[P[j].id]);
			j++;
		}
		f[P[i].id]=get(P[i].y-1)+1;
	}
}
bool cmp2(poi a,poi b)
{
	if(a.y==b.y) return a.x<b.x;
	return a.y<b.y;
}
void lisan()
{
	sort(P,P+N+1,cmp2);
	int cnt=1;
	int Y[SIZEN]={0};
	Y[0]=cnt;
	for(int i=1;i<=N;i++)
	{
		if(P[i].y!=P[i-1].y) cnt++;
		Y[i]=cnt;
	}
	for(int i=0;i<=N;i++) P[i].y=Y[i];
}
void work()
{
	set();
	//for(int i=0;i<=N;i++) cout<<P[i].x<<" "<<P[i].y<<" "<<P[i].id<<endl;
	lisan();
	sort(P,P+N+1,cmp);
	//for(int i=0;i<=N;i++) cout<<P[i].x<<" "<<P[i].y<<" "<<P[i].id<<endl;
	DP();
	printf("%d",f[0]-1);
}
int main()
{
	freopen("asm_second.in","r",stdin);
	freopen("asm_second.out","w",stdout);
	read();
	work();
	return 0;
}