JZOJ5950. 【NOIP2018模擬11.04】虐暴全場
阿新 • • 發佈:2018-11-07
題解
很顯然,每個線段與它的
連起來就是一個凸殼,
所以很自然地想到就是用個棧維護。
code
#include<cstdio> #include<algorithm> #include<cstring> #define ls (x<<1) #define rs (x<<1|1) #define M ((l+r)>>1) #define P putchar #define db double using namespace std; const int N=1000003; int n,m,nxt[N],ans,id,X[N],y[N]; int z[N],top; double k[N],b[N]; char ch; void read(int&n) { for(ch=getchar();ch<'0' || ch>'9';ch=getchar()); for(n=0;'0'<=ch && ch<='9';ch=getchar())n=(n<<1)+(n<<3)+ch-48; } void write(int x){if(x>9)write(x/10);P(x%10+48);} int main() { freopen("beatall.in","r",stdin); freopen("beatall.out","w",stdout); read(n); for(int i=1;i<=n;i++) { read(X[i]),read(y[i]); ans=i;k[i]=0;b[i]=y[i]; for(;top && k[z[top]]*X[i]+b[z[top]]-y[i]<=0;top--); if(top)ans=z[top],k[i]=(db)(y[ans]-y[i])/(X[ans]-X[i]),b[i]=(db)y[i]-k[i]*X[i]; z[++top]=i; write(ans);P('\n'); } }