传送门


首先显然的是可以一开始先染好再做、每个点只会被染一次、最后只剩下两种颜色。

接下来是结论时间:序列可以反转的充要条件是除了首尾的极大颜色连通块以外其他极大颜色连通块长度为偶数。


证明充分性:考虑归纳。

如果序列中有\(3\)个极大颜色连通块且中间的连通块长度为偶数,那么先将两端的颜色块折成\(1\),然后沿着中间块的中线对折,然后把较大的块折成\(1\)即可满足条件。

如果序列中有\(x>3\)个极大颜色连通块,则把尾部的极大颜色连通块长度折成\(1\)然后沿着倒数第二个颜色块的中线对折,可以得到一个有\(x-1\)个极大颜色连通块的局面。

由归纳可知假设成立。


证明必要性:仍然考虑归纳。

如果序列中有\(1\)个非首尾极大颜色连通块长度为奇数,那么无论如何这个奇数的连通块和与其相邻的连通块无法被对折,所以显然无解。

如果序列中有\(\geq 2\)个非首尾长度为奇数的极大颜色连通块,则如果进行折叠,显然不会使这样的连通块数量减少为\(0\)。

由归纳可知假设成立


与上面的结论等价的结论是:同色连通块的起始位置的奇偶性相同。

这样我们枚举每一种颜色,再枚举其起始位置的奇偶性,对于一个原序列中这样的非首尾极大连通块,如果不满足条件就尽可能向前后拓展。最后维护一下非当前位置的元素中出现次数最多的颜色就可以了。

复杂度不难做到\(O(n)\)。

#include<bits/stdc++.h>
using namespace std;int read(){int a = 0; char c = getchar(); while(!isdigit(c)) c = getchar();while(isdigit(c)){a = a * 10 + c - 48; c = getchar();}return a;
}const int _ = 1e6 + 7; vector < int > pos[_]; int arr[_] , pot[_] , sz[_] , MX , N , M;void del(int x){if(!--sz[pot[x]] && pot[x] == MX) --MX; ++sz[--pot[x]];}
void add(int x){--sz[pot[x]]; ++sz[++pot[x]];}int main(){N = read(); M = read(); if(M == 1){puts("0"); return 0;}for(int i = 1 ; i <= N ; ++i){++pot[arr[i] = read()]; pos[arr[i]].push_back(i);}for(int i = 1 ; i <= M ; ++i){++sz[pot[i]]; MX = max(MX , pot[i]);}for(int i = 1 ; i <= M ; ++i){int ans = 1e9 , p = 0 , q , now , pre = MX , S = pos[i].size(); --sz[pot[i]]; while(!sz[MX]) --MX; now = MX;while(p < S){q = p; while(q < S && pos[i][q] - pos[i][p] == q - p) ++q;if(!(pos[i][p] & 1)) del(arr[pos[i][p] - 1]);if(pos[i][q - 1] != N && (pos[i][q - 1] & 1)) del(arr[pos[i][q - 1] + 1]);p = q;}ans = min(ans , N - pot[i] - MX); MX = now; p = 0;while(p < S){q = p; while(q < S && pos[i][q] - pos[i][p] == q - p) ++q;if(!(pos[i][p] & 1)) add(arr[pos[i][p] - 1]);if(pos[i][q - 1] != N && (pos[i][q - 1] & 1)) add(arr[pos[i][q - 1] + 1]);p = q;}p = 0;while(p < S){q = p; while(q < S && pos[i][q] - pos[i][p] == q - p) ++q;if(pos[i][p] != 1 && (pos[i][p] & 1)) del(arr[pos[i][p] - 1]);if(pos[i][q - 1] != N && !(pos[i][q - 1] & 1)) del(arr[pos[i][q - 1] + 1]);p = q;}printf("%d\n" , min(ans , N - pot[i] - MX)); p = 0; MX = pre; ++sz[pot[i]];while(p < S){q = p; while(q < S && pos[i][q] - pos[i][p] == q - p) ++q;if(pos[i][p] != 1 && (pos[i][p] & 1)) add(arr[pos[i][p] - 1]);if(pos[i][q - 1] != N && !(pos[i][q - 1] & 1)) add(arr[pos[i][q - 1] + 1]);p = q;}}return 0;
}

转载于:https://www.cnblogs.com/Itst/p/11553085.html

LOJ2336 JOI2017 绳 贪心、构造相关推荐

  1. 贪心+构造 Codeforces Round #277 (Div. 2) C. Palindrome Transformation

    题目传送门 1 /* 2 贪心+构造:因为是对称的,可以全都左一半考虑,过程很简单,但是能想到就很难了 3 */ 4 /**************************************** ...

  2. 2021年度训练联盟热身训练赛第五场 H题In-place Sorting+贪心构造

    题意: 给你n个小于101810^{18}1018的大数,问在可以再不改变序列位置,之改变数值中某数位的'9'变为'6'或将'6'变为'9',求的最终序列由小到大,且字典序最小. 题目: 链接:htt ...

  3. 【牛客 - 318G】LLLYYY的数字思维 与【牛客 - 289J】这是一个沙雕题II(贪心构造)

    题干: LLLYYY很喜欢写暴力模拟贪心思维.某一天在机房,他突然抛给了队友ppq一 个问题.问题如下: 有一个函数f (): int f(int x){     int tmp = 0;     w ...

  4. 常规贪心构造题 最多能完成排序的块 II

    这是 LeetCode 上的  最多能完成排序的块 II ,难度为 困难. Tag : 「贪心」 这个问题和"最多能完成排序的块"相似,但给定数组中的元素可以重复,输入数组最大长度 ...

  5. hdu 4982 贪心构造序列

    http://acm.hdu.edu.cn/showproblem.php?pid=4982 给定n和k,求一个包含k个不相同正整数的集合,要求元素之和为n,并且其中k-1的元素的和为完全平方数 枚举 ...

  6. CodeForces - 1494D Dogeforces(贪心+构造)

    题目链接:点击查看 题目大意:给出 nnn 个叶子结点和一个 n∗nn*nn∗n 的 LCALCALCA 矩阵,其中 LCALCALCA 表示的是最近公共祖先节点的权值,现在需要构造出一棵自顶向下权值 ...

  7. CodeForces - 1364C Ehab and Prefix MEX(贪心+构造)

    题目链接:点击查看 题目大意:给出一个数组 a ,要求构造一个数组 b ,使得 a[ i ] = MEX{ b[ 1 ] , b[ 2 ] , ... b[ i - 1 ] , b[ i ] },a[ ...

  8. CodeForces - 1265D Beautiful Sequence(贪心+构造+思维)

    题目链接:点击查看 题目大意:给出a个0,b个1,c个2,d个3,要求构造一种序列,使得数列两两之间绝对值之差等于1,若不能构造输出NO 题目分析:首先我们需要稍微讨论一下特殊情况,那就是对于两端的数 ...

  9. CodeForces - 1256C Platforms Jumping(贪心+构造)

    题目链接:点击查看 题目大意:现在固定人初始时在点0处,现在我们需要跨过长度为n的一条河,到达对岸的点n+1处,给出m个木板,我们可以将这m个木板随意摆放,但相对位置不能改变,并且只能互相接触而不能互 ...

  10. 【Comet OJ - Contest #5 - C】迫真小游戏(优先队列,贪心构造,树,字典序)

    题干: H君喜欢在阳台晒太阳,闲暇之余他会玩一些塔防小游戏. H君玩的小游戏可以抽象成一棵 nn 个节点的有根树,树以 11 为根,每个点的深度定义为其到根的简单路径上的点数(根的深度为 11). H ...

最新文章

  1. MyBatis学习总结(二)——使用MyBatis对表执行CRUD操作
  2. 北海a货翡翠,牡丹江a货翡翠
  3. SAP物料移动类型和自动科目设置(包含财务,pp)
  4. 小白的奇幻数学课堂(part2)--敌人的敌人就是朋友,这其实就是负负得正法则
  5. vue-element-admin中 vuex 的使用
  6. 《企业软件交付:敏捷与高效管理精要》——3.4 企业软件交付的软件工厂方法...
  7. Java基础入门笔记-整数+小数+字符串+打印
  8. 物理内存是如何组织管理的
  9. java接口自动化测试
  10. mac可装云服务器_Mac 下阿里云服务器的配置方法
  11. Go 基础(二)关键字和代码注释
  12. 【学习亚马逊AWS IOT体系有感---万物互联(物联网)】
  13. 解决:Flutter 不识别 iPhone 测试机
  14. 程序实现蒙特卡洛算法计算PI值和积分
  15. 实现Web端指纹登录
  16. ❤️微信小程序 云开发 教程合集(视频+图文)免费❤️
  17. Python小工具-电影天堂爬取电影下载链接
  18. 推断速度达seq2seq模型的100倍,谷歌开源文本生成新方法LaserTagger
  19. Milimeter-Wave UAV Communications(41-50)
  20. 乳酪gi_Windows 8生产力:谁动了我的奶酪? 哦,是的。

热门文章

  1. 使用TensorFlow在Transformers 上生成字幕的注意机制的实现
  2. 严重性 代码 说明 项目 文件 行 警告 C4819 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失 opencv-05 d:\opencv\o
  3. php mysql pod_php – 连接到同一pod中的MySQL容器
  4. Zotero 安装 插入引用
  5. override java field_JAVA方法的重载(overload)和覆盖(override)
  6. 我要发明计算机作文,我要发明机器人作文700字
  7. 【mysql】扩展-变量_存储过程_函数
  8. 动画效果之手机端实现垃圾桶效果
  9. PowerDesigner 16.5 安装图解 与 快速入门
  10. Spring boot 跨域请求实现方式汇总