Content

给定一个大小为 \(n\) 的数组。你可以将其分为 \(k\) 个子数组,并按照每个子数组的字典序重新排列这些子数组,再顺次拼接,得到一个新的数组。问是否存在一种划分子数组的方案,使得重新拼接后的数组是单调不降的?

数据范围:\(t\) 组数据,\(1\leqslant t\leqslant 1000\),\(1\leqslant k\leqslant n\leqslant 10^5\),\(0\leqslant |a_i|\leqslant 10^9\),\(\sum n\leqslant 3\times 10^5\)。

Solution

我们不妨将原来的数组中的元素按照其在数组中的大小顺序重新编号。例如说 \([1,-4,0,-2]\)(即样例第二组数据)可以按照这种方式重新编号为 \([4,1,3,2]\)。然后这道题目就转化为是否可以找到一组划分方案使得重新拼接后的数组是 \([1,2,3,\dots,n]\)。

这就非常简单了。首先一个很显然的结论,要想划分的数组尽量少,就尽量把变化后的数组中连续且单调递增的一段分成一个子数组。比如说 \([6,1,4,5,7,8,9,2,3]\) 就可以按照这种思想划分为 \([6],[1],[4,5],[7,8,9],[2,3]\)。可以证明这种划分方案可以使得最终划分的子数组尽量少。

设我们按照上面的方案最终划分的子数组的数量为 \(x\),则最后只需要看是否有 \(x\leqslant k\) 即可。

Code

namespace Solution {
int a[100007], id[100007]; ib cmp(int ida, int idb) {return a[ida] < a[idb];} iv Main() {
MT {
int n = Rint, k = Rint, cnt = 1;
F(int, i, 1, n) a[i] = Rint, id[i] = i;
sort(id + 1, id + n + 1, cmp);
// F(int, i, 1, n) printf("%d%c", id[i], " \n"[i == n]);
F(int, i, 2, n) if(id[i] != id[i - 1] + 1) cnt++;
cnt > k ? No : Yes;
}
return;
}
}

最新文章

  1. Hive的安装
  2. Python 操作 MongoDB
  3. 利用NABC模型进行竞争性需求分析
  4. PC问题-可以PING通IP,PING名字不通,可以远程,但不能访问共享文件夹?
  5. Windows内核之进程基本含义以及进程的创建
  6. c-version:null]] could not deserialize the servlet-context scoped attribute with name: &quot;MENU_LIST&quot;
  7. ADT &quot;Running Android Lint&quot; has encountered a problem
  8. jQuery格式化时间插件formatDate
  9. vs2012 网站无法使用自定义服务器的解决方法
  10. libevent在windows下使用步骤详解
  11. ASP.NET Core 添加统一模型验证处理机制
  12. 93.Restore IP Addresses(M)
  13. 使用ArcMap做一个1:5000标准分幅图并编号
  14. 基于CRF工具的机器学习方法命名实体识别的过
  15. 《Android进阶之光》--View体系与自定义View
  16. 【剑指offer】两个链表的第一个公共结点
  17. java 之 音乐播放代码
  18. Selenium自动化测试框架入门整理
  19. How to Pronounce TH after N or Z
  20. ZooKeeper_客户端工具zkCli.sh使用

热门文章

  1. 撸了一个可调试 gRPC 的 GUI 客户端
  2. Codeforces 1264F - Beautiful Fibonacci Problem(猜结论+找性质)
  3. [R] 保存pheatmap图片对象到文件
  4. Yii2 源码分析 入口文件执行流程
  5. 执行脚本source 和 . 和sh 的区别是什么
  6. ggplot2 图例及分页参数
  7. DRF请求流程及主要模块分析
  8. requests+bs4爬取豌豆荚排行榜及下载排行榜app
  9. 进阶版的java面试
  10. C语言中的各种字符串输入方法