BZOJ4880 [Lydsy2017年5月月賽]排名的戰爭
阿新 • • 發佈:2019-02-11
容易發現答案只與w1和w2的比值有關,而與具體數值無關
那麼先特殊算一下w1=0和w2等於0的情況,然後就直接假設w1=1
然後的話對於每個物品可能有4種情況:永遠比1號優,永遠比1號劣,永遠和1號相等,當w2<某值時比1號優,等於時相等,否則比一號劣,或者當w2>某值時比1號劣,等於時相等,否則比1號優
對於每個手機算一下他的情況和w2的分界點,然後按分界點排序之後掃一遍即可
比賽的時候有個地方x和y打反一直wa,然後就棄療了
#include<iostream> #include<cstdlib> #include<cstdio> #include<cstring> #include<ctime> #include<cmath> #include<algorithm> #include<iomanip> #include<queue> #include<map> #include<bitset> #include<stack> #include<vector> #include<set> using namespace std; #define MAXN 100010 #define MAXM 1010 #define INF 1000000000 #define MOD 1000000007 #define ll long long #define eps 1e-8 struct data{ double v; int c; friend bool operator <(data x,data y){ return x.v<y.v; } }; int n; int x[MAXN],y[MAXN]; int low=1,high=INF; data t[MAXN]; int tot; int main(){ int i; scanf("%d",&n); for(i=1;i<=n;i++){ scanf("%d%d",&x[i],&y[i]); } int tlowx=1,thighx=1,tlowy=1,thighy=1; for(i=2;i<=n;i++){ if(x[i]>x[1]){ thighx++; } if(x[i]>=x[1]){ tlowx++; } if(y[i]>y[1]){ thighy++; } if(y[i]>=y[1]){ tlowy++; } } low=max(low,max(tlowx,tlowy)); high=min(high,min(thighx,thighy)); int tlow=1,thigh=1; for(i=2;i<=n;i++){ if(y[i]==y[1]){ if(x[i]>=x[1]){ tlow++; } if(x[i]>x[1]){ thigh++; } continue ; } if(y[i]<y[1]){ t[++tot].v=1000.*(x[1]-x[i])/(y[i]-y[1]); t[tot].c=-1; tlow++; thigh++; } if(y[i]>y[1]){ t[++tot].v=1000.*(x[1]-x[i])/(y[i]-y[1]); t[tot].c=1; } if(t[tot].v<=0){ tlow+=t[tot].c; thigh+=t[tot].c; tot--; } } if(tot){ sort(t+1,t+tot+1); for(i=1;i<=tot;){ int wzh=i; int tc0=0,tc1=0; while(wzh<=tot&&fabs(t[wzh].v-t[i].v)<eps){ if(t[wzh].c==1){ tc1++; }else{ tc0++; } wzh++; } low=max(low,tlow+tc1); high=min(high,thigh-tc0); tlow+=tc1-tc0; thigh+=tc1-tc0; i=wzh; } } printf("%d %d\n",high,low); return 0; } /* 2 3 2 1 2 */