导弹拦截问题的一些变式
-
导弹拦截:一套系统能拦截一个不增子列,问拦截所有导弹至少要几套系统
-
cf1296 E2. String Coloring (hard version):给字符串中的每个字符涂色,颜色不同的相邻字符可以swap,问最少需几种颜色可以让字符串能排序
如果字符集变成1~n就成了下面这题
-
daimayuan 699. 并行排序:给定长度为 n 的排列,把所有逆序对连上边。现在要给 n 个点染色,要求任意一条边的两点颜色不同,问最少需几种颜色
-
2020ICPC昆明 L.Simone and graph coloring:同上。但还要输出一种染色方案
-
数组中有重复值
上面5个题的做法都一样。
法一:树状数组
从大到小考虑ai,假设在ai左边的所有比ai大的数用掉了颜色1,2,3,...x,那么ai就涂x+1。比如1 4 3 2,先给4染上颜色1;再考虑3,3的左边比3大的数用掉了颜色1,那3就染颜色2;再考虑2,2的左边比2大的数用掉了颜色1、2,那2就染颜色3
第2题字符集很小,可以直接暴力找。第3第4题树状数组维护区间最大值即可
若有重复值,对于相等的值从右往左考虑
法二:贪心二分/LIS/Dilworth定理
一条不降的子列上的点能被染成同一种颜色,找最多的不降子列即可。每次二分找一个刚好能放的位置放上去。
或者根据Dilworth定理,不降子列个数=最长不上升子列长度,转化为求LIS。其实是一样的

浙公网安备 33010602011771号