#P16253. [InfO(1) Cup 2021 国际轮]Bricks积木

[InfO(1) Cup 2021 国际轮]Bricks积木

题目描述

小方块和小三角收到了一份由小圆圈送来的礼物:一列共有 NN 块的玩具积木。

积木从左到右编号为 0,1,,N10,1,\ldots,N-1。所有积木的高度两两不同。第 ii 块积木具有:

  • 高度 H[i]H[i]
  • 颜色 C[i]C[i]

其中:

  • C[i] = true 表示红色;
  • C[i] = false 表示紫色。

如果一块积木右侧不存在比它更高且与它颜色相同的积木,就称这块积木是有趣的

你可以至多选择一块积木并改变它的颜色,即:

  • 从红色变为紫色;或
  • 从紫色变为红色。

也可以不改变任何积木。

请计算经过上述操作后,有趣积木数量的最大可能值。

调用协议

你需要实现以下函数:

int solve(int N, bool C[], int H[]);

该函数只会被调用一次。

需要注意,数组 CH 的实际长度不一定恰好为 NN,可能更长。对所有 iNi\ge N,保证:

H[i] = 0
C[i] = false

函数应返回最多能够得到多少块有趣积木。

选手不应实现 main 函数

样例 grader 的输入格式

样例 grader 从标准输入读取:

  • 第一行一个整数 NN
  • 第二行 NN0/10/1 整数表示颜色,其中 0 表示紫色,1 表示红色;
  • 第三行 NN 个整数表示高度 HH

随后输出调用 solve 得到的返回值。

数据范围

  • 1N6×1061\le N\le6\times10^6
  • 1H[i]2×1091\le H[i]\le2\times10^9
  • 所有高度两两不同。

子任务

子任务 分值 限制
1 9 不需要改变原数组中的任何颜色
2 21 对所有 0i<N0\le i<N,均有 C[i] = true
3 13 1N10001\le N\le1000
4 29 1N2000001\le N\le200000
5 28 无额外限制

样例

输入:
6
0 0 1 0 0 1
7 8 6 2 3 5

输出:
5

样例说明

改变第一块或第二块积木的颜色后,高度为

7 8 6 3 5

的五块积木会成为有趣积木,因此答案为 55

@下发文件