1. 程式人生 > >JZOJ-senior-5950. 【NOIP2018模擬11.04】虐暴全場

JZOJ-senior-5950. 【NOIP2018模擬11.04】虐暴全場

Time Limits: 1500 ms Memory Limits: 131072 KB

Description

眾所周知,DH是一位人生贏家,他不僅能虐暴全場,而且還正在走向人生巔峰;
一天,DH在刷題的時候碰到了一道大模擬題:
在這裡插入圖片描述
DH表示他要趕著去幹人生贏家應該乾的事並把這道題扔給了你。

Input

在這裡插入圖片描述

Output

n行n個數,表示模擬過程中你輸出的n個b_i。

Sample Input

7
1 10
2 7
3 8
4 2
5 6
6 100
7 10

Sample Output

1
1
1
3
1
6
6

Data Constraint

在這裡插入圖片描述

Solution

單調棧維護個類似凸殼的東西即可

Code

#include<algorithm>
#include<cstdio>
#include<cctype>

#define fo(i,a,b) for(int i=a;i<=b;++i)
#define fd(i,a,b) for(int i=a;i>=b;--i)
#define P(c) putchar(c)
#define db double

using namespace std;

const int N=1e6+5;
int n,cnt,x[N],y[N]
,f[N],z[N]; db p[N]; inline void read(int &n) { int x=0,w=0; char ch=0; while(!isdigit(ch)) w|=ch=='-',ch=getchar(); while(isdigit(ch)) x=(x<<3)+(x<<1)+(ch^48),ch=getchar(); n=w?-x:x; } inline void write(int x) { if(x<0) putchar('-'),x=-x; if(x>9) write(x/10); putchar(x%10+'0'
); } db xl(int p,int q) { return 1.0*((db)y[p]-(db)y[q])/((db)x[p]-(db)x[q]); } int main() { freopen("beatall.in","r",stdin); freopen("beatall.out","w",stdout); read(n); fo(i,1,n) read(x[i]),read(y[i]),f[i]=i; write(1),P('\n'); int h=y[1]; z[++cnt]=1; fo(i,2,n) { if(y[i]>=h) { write(i),P('\n'); h=y[i]; z[cnt=1]=i; continue; } if(cnt==1) { f[i]=z[cnt],write(f[i]),P('\n'); z[++cnt]=i,p[cnt]=xl(z[cnt-1],z[cnt]); } else { while(cnt>1&&xl(z[cnt],i)>=p[cnt]) --cnt; int id=z[cnt]; db k=xl(id,i); if(k<p[cnt]) { f[i]=id,write(f[i]),P('\n'); z[++cnt]=i,p[cnt]=xl(z[cnt-1],z[cnt]); } else { f[i]=z[cnt],write(f[i]),P('\n'); z[++cnt]=i,p[cnt]=xl(z[cnt-1],z[cnt]); } } } }