bzoj 4880: [Lydsy2017年5月月賽]排名的戰爭

zz題,隨便搞搞就行了

然而代碼寫得又醜又慢,有時間再改改吧

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std;
typedef long long LL;
inline int read()
{
	int x=0;bool f=0;char c=getchar();
	for (;c<'0'||c>'9';c=getchar()) f=c=='-'?1:0;
	for (;c>='0'&&c<='9';c=getchar()) x=x*10+c-'0';
	return f?-x:x;
}
#define R register
const int N=100005;
int n,m,m2,p0,p1,x1,y1,cnt0=0,ans1,ans2;
struct na {int x,y;}e[N],num[N];
inline bool cmp (const na &a,const na &b){
	if (a.x==b.x&&a.y==b.y) return 0;
	if (!a.x&&!b.x) return 0;
	if (!a.x) return 1;
	if (!b.x) return 0;
	if ((a.x>0)^(b.x>0)) return a.y*b.x>a.x*b.y;
	return a.y*b.x<a.x*b.y;
}
inline bool eql(const na &a,const na &b){
	return (!a.x&&!b.x)||(a.x*b.y==a.y*b.x);
}

struct bitt{
	int ss[N];
	inline void add(R int x,R int a){
		for (;x;x-=x&-x) ss[x]+=a;
	}
	inline int cal(R int x){
		int rec=0;
		for (;x<=p0;x+=x&-x) rec+=ss[x];
		return rec;
	}
}s1,s2;

int main()
{
	n=read()-1;
	x1=read(),y1=read();
	for (int i=1;i<=n;i++)
	{
		e[i].x=read()-x1,e[i].y=read()-y1;
		if (!e[i].x&&!e[i].y) n--,i--,cnt0++;
		else num[++m]=e[i];
	}
	num[++m]=(na){0,1};
	num[++m]=(na){1,0};//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
	sort(num+1,num+m+1,cmp);m2=1;
	for (int i=2;i<=m;i++)
		if (m2&&!eql(num[m2],num[i])) 
			num[++m2]=num[i];
	m=m2;
//	m=unique(num+1,num+m+1,cmp)-num-1;
	p0=lower_bound(num+1,num+m+1,(na){1,0},cmp)-num;
	p1=lower_bound(num+1,num+m+1,(na){0,1},cmp)-num;
	for (int i=1;i<=n;i++){
		int x=e[i].x,y=e[i].y,k=lower_bound(num+1,num+m+1,e[i],cmp)-num;
		if (!y)
		{
			if (x>0)
			{
				s1.add(p0-1,1);
				s2.add(p0,1);
			}
			else
			{
				s2.add(p0,1);
				s2.add(p0-1,-1);
			}
		}
		else if (!x)
		{
			if (y>0)
			{
				s1.add(p0,1);
				s1.add(1,-1);
				//!!!!!!!!!!!!!!!!!!!!!!!1
				s2.add(p0,1);
			}
			else
			{
				s2.add(1,1);
			}
		}
		else if (x>0&&y>0)
		{
			s1.add(p0,1);
			s2.add(p0,1);
		}
		else if (x>0&&y<0)
		{
			s1.add(k-1,1);
			s2.add(k,1);
		}
		else if (x<0&&y>0)
		{
			s1.add(p0,1);
			s1.add(k,-1);
			s2.add(p0,1);
			s2.add(k-1,-1);
		}
	}
	ans1=1e9;ans2=0;
	for (int i=1;i<=p0;i++) 
	{
		ans1=min(ans1,s1.cal(i));
		ans2=max(ans2,s2.cal(i));
	}
	ans1++;
	ans2=ans2+1+cnt0;
	printf("%d %d\n",ans1,ans2);
	return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章