bzoj 4880: [Lydsy2017年5月月赛]排名的战争

xiaoxiao2021-02-28  138

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

转载请注明原文地址: https://www.6miu.com/read-44122.html

最新回复(0)