Warning: session_start(): open(/tmp/sess_ea93b6bff87515ee70f9e24180e22c85, O_RDWR) failed: No space left on device (28) in /data/wiki/inc/init.php on line 239

Warning: session_start(): Failed to read session data: files (path: ) in /data/wiki/inc/init.php on line 239

Warning: Cannot modify header information - headers already sent by (output started at /data/wiki/inc/init.php:239) in /data/wiki/inc/auth.php on line 430

Warning: Cannot modify header information - headers already sent by (output started at /data/wiki/inc/init.php:239) in /data/wiki/inc/actions.php on line 38

Warning: Cannot modify header information - headers already sent by (output started at /data/wiki/inc/init.php:239) in /data/wiki/lib/tpl/dokuwiki/main.php on line 12
2020-2021:teams:legal_string:jxm2001:contest:cf_mar21 [CVBB ACM Team]

用户工具

站点工具


2020-2021:teams:legal_string:jxm2001:contest:cf_mar21

CodeChef March Challenge 2021

Paparazzi Gennady

题意

给定 $n$ 条垂直的线段,其中第 $i$ 条线段横坐标为 $i$,纵坐标范围为 $[0,h_i)$。

求最大的 $d$ 使得存在 $i$ 使得线段 $(i,h_i)\to (i+d,h_{i+d})$ 与其他所有给定垂线都不相交。

题解

首先构造 $n$ 个点的凸包,设凸包的边界上的点(如果两点以上共线则忽略除两端点以外的点)为 $x_1,x_2,x_3\cdots $

对 $x_i\lt j\lt x_{i+1}$,不难发现一定有 $j+d\le x_{i+1}$,所以 $j$ 对应的 $d$ 一定小于 $x_i$。

于是答案为 $\max(x_{i+1}-x_i)$,时间复杂度 $O(n)$。

查看代码

查看代码

const int MAXN=5e5+5;
int h[MAXN],st[MAXN];
int main()
{
	int T=read_int();
	while(T--){
		int n=read_int();
		_for(i,0,n)h[i]=read_int();
		int top=0,ans=0;
		st[top]=0;
		_for(i,1,n){
			while(top){
				int x1=st[top]-st[top-1],x2=i-st[top-1];
				int y1=h[st[top]]-h[st[top-1]],y2=h[i]-h[st[top-1]];
				if(1LL*y2*x1>=1LL*y1*x2)top--;
				else
				break;
			}
			ans=max(ans,i-st[top]);
			st[++top]=i;
		}
		enter(ans);
	}
	return 0;
}
2020-2021/teams/legal_string/jxm2001/contest/cf_mar21.1617014348.txt.gz · 最后更改: 2021/03/29 18:39 由 jxm2001