3743. Alice and Bob

题目描述

3743. Alice and Bob_第1张图片

Sample Input
输入1:

4

1 2 2 3

输入2:

4

1 1 2 3

Sample Output
输出1:

5

输出2:

5

N<=10^5

题解

注意给出的是a

一种神奇的做法

从后往前求max(b[i]),假设b[i+1]~b[n]已经求出,考虑能转移到b[i]的b[j]

设pre[i]表示最后一个a[i]-1的位置(a[0]=0),把(i,a[i])丢到笛卡尔坐标系上,从(i,a[i])向(pre[i],a[pre[i]])连线,则图形成一棵树

3743. Alice and Bob_第2张图片

若b[j]能转移到b[i],那么i向下做一条不经i点的射线,把射线经过的边断开,则必然能把j点与0点分开

如图,则b[2]可以由b[3]和b[4]转移,但b[3]不能由b[4]转移

证明:

线的实质就是x=a时a数组的转移情况,现要使b最大,那么就要把x尽量上移

如果x[i]经过了一条线,则会导致a[i]改变,不满足要求


每次可以把一个点以及其后面的点的答案向pre传,同时维护以a为关键字的线段树即可

code

#include 
#define fo(a,b,c) for (a=b; a<=c; a++)
#define fd(a,b,c) for (a=b; a>=c; a--)
#define max(a,b) (a>b?a:b)
#define min(a,b) (a

你可能感兴趣的:(3743. Alice and Bob)