JZOJ-senior-5950. 【NOIP2018模擬11.04】虐暴全場
阿新 • • 發佈:2018-11-09
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]);
}
}
}
}