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]);
			}
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值