#P16252. [InfO(1) Cup 2021 国际轮 ]Subarray Sort子数组排序

[InfO(1) Cup 2021 国际轮 ]Subarray Sort子数组排序

题目描述

小方块在祖父家度过寒假后回到了家。离开期间,他的朋友小三角玩过他的玩具。共有 NN 个玩具,编号为 1,2,,N1,2,\ldots,N

为了不让小方块生气,小三角需要把玩具重新排列成:

1,2,,N.1,2,\ldots,N.

最初,所有玩具以某个顺序排成一列,因此给定的是一个 1N1\sim N 的排列 PP

小三角可以选择一个连续区间 [i,j][i,j],将这个区间中的玩具按编号从小到大排序。该操作需要的时间为:

ji+1\left\lfloor\sqrt{j-i+1}\right\rfloor

秒。

请计算将整个排列变为升序排列所需的最少总时间。

调用协议

你需要实现以下函数:

int solve(int N, int P[]);

该函数只会被调用一次。

  • N 表示玩具数量;
  • P 是一个从下标 00 开始的数组,表示玩具的初始排列;
  • 函数应返回将排列完全排好序所需的最少时间。

选手不应实现 main 函数

样例 grader 的输入格式

样例 grader 从标准输入读取:

  • 第一行一个整数 NN
  • 第二行 NN 个整数,表示排列 PP

样例 grader 将 solve 的返回值输出到标准输出。

数据范围

  • 1N4×1061\le N\le4\times10^6
  • PP1,2,,N1,2,\ldots,N 各出现恰好一次;
  • x\lfloor x\rfloor 表示不超过 xx 的最大整数;
  • 正式评测使用的 grader 不保证与下发的样例 grader 完全相同。

子任务

子任务 分值 限制
1 7 PP 随机生成
2 8 1N91\le N\le9
3 35 1N20001\le N\le2000
4 25 1N1000001\le N\le100000
5 无额外限制

样例 1

输入:
5
3 1 4 2 5

输出:
2

样例说明

先将区间 [0,1][0,1] 排序,耗时

2=1,\left\lfloor\sqrt2\right\rfloor=1,

排列变为:

1 3 4 2 5

再将区间 [1,3][1,3] 排序,耗时

3=1,\left\lfloor\sqrt3\right\rfloor=1,

排列变为:

1 2 3 4 5

总耗时为 22 秒,且这是最优答案。

样例 2

输入:
3
1 2 3

输出:
0

排列本来已经有序,不需要执行操作。

@下发文件