Portal --> arc080_f

Solution

​   这题的话。。差分套路题(算吗?反正就是想到差分就很好想了qwq)

​​   (但是问题就是我不会这种套路啊qwq题解原话是:“这种翻面一段区间的题,就是差分套路题”==)

​   我们定义一个新的数组\(A\),\(A_i\)表示的是第\(i\)个和第\(i-1\)个的状态是否相同,是的话为\(0\)否则为\(1\),至于第\(0\)个的话。。我们强行定义第\(0\)个位置反面向上

​   这样我们就得到了一个\(01\)序列,然后原来的一段需要操作的区间就变成了两个\(1\),那么我们现在要做的事情就变成了,每次找一个奇质数\(p\),将第\(i\)位和第\(i+p\)位取反,最后让所有的\(1\)变成\(0\)即可

​​  

​   接下来我们根据两个\(1\)的下标之差(记为相距)来分类讨论:

1.相距为奇质数:只需要\(1\)步,为了使得使用的步数尽量少,我们在后面的操作中显然应该尽量采取这种操作

2.相距为偶数:需要\(2\)步,这里用到哥德巴赫猜想,大于等于\(6\)的偶数可以分解成两个奇质数之和

3.相距为奇合数:需要\(3\)步,具体就是将这个奇合数变成一个奇质数与偶数之差就好了

​  

​​   然后我们要尽量让第一种操作尽量多,因为每次是挑两个\(1\)消掉,所以这里可以转化成一个最大匹配问题:我们将所有的\(1\)按照下标的奇偶性分成两类,偶数往奇数连,两个点连边当且仅当下标之差是一个奇质数,这样跑一遍最大匹配就可以得到尽量使用第一种操作的数量,记为\(ans1\)

​​   然而这个时候可能还有剩的数,那么我们优先第二种操作,也就是同组匹配(差值为偶数),当这样匹配完了之后还有剩余,只可能是两组各剩一个的情况(因为\(1\)总是成对出现的,总数量肯定是一个偶数),那么这两个再用第三种操作匹配掉,然后答案加\(3\)就好了

​​   额当然。。二分图匹配可以跑网络流qwq会快很多qwq

​  

​​   代码大概长这个样子

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #define ll long long
  5. using namespace std;
  6. const int N=210,MX=1e7+10;
  7. struct xxx{
  8. int y,nxt;
  9. }a[N*N*2];
  10. int h[N];
  11. int inpt[N],p[MX],mark[MX],mnp[MX],col[MX],A[MX];
  12. int used[N*2],match[N*2],llis[N*2],rlis[N*2];
  13. int n,m,mx,tot,T,lcnt,rcnt;
  14. ll ans;
  15. void add(int x,int y){a[++tot].y=y; a[tot].nxt=h[x]; h[x]=tot;}
  16. void prework(int n){
  17. int cnt=0;
  18. mnp[1]=1;
  19. mark[1]=1;
  20. for (int i=2;i<=n;++i){
  21. if (!mark[i])
  22. p[++cnt]=i,mnp[i]=i;
  23. for (int j=1;j<=cnt&&i*p[j]<=n;++j){
  24. mark[i*p[j]]=true;
  25. if (i%p[j]==0){
  26. mnp[i*p[j]]=p[j];
  27. break;
  28. }
  29. }
  30. }
  31. }
  32. bool check(int x){
  33. int u;
  34. for (int i=h[x];i!=-1;i=a[i].nxt){
  35. u=a[i].y;
  36. if (used[u]==T) continue;
  37. used[u]=T;
  38. if (!match[u]||check(match[u])){
  39. match[x]=u; match[u]=x;
  40. return true;
  41. }
  42. }
  43. return false;
  44. }
  45. void build(){
  46. int x,y;
  47. memset(h,-1,sizeof(h));
  48. tot=0;
  49. for (int i=1;i<=llis[0];++i){
  50. x=llis[i];
  51. for (int j=1;j<=rlis[0];++j){
  52. y=rlis[j];
  53. if (mark[abs(x-y)]) continue;
  54. add(i,j+llis[0]);
  55. add(j+llis[0],i);
  56. }
  57. }
  58. }
  59. void solve(){
  60. llis[0]=0; rlis[0]=0;
  61. int tmpcnt=0;
  62. for (int i=1;i<=mx;++i)
  63. if (col[i]!=col[i-1]){
  64. if (i&1)
  65. rlis[++rlis[0]]=i;
  66. else
  67. llis[++llis[0]]=i;
  68. ++tmpcnt;
  69. }
  70. build();
  71. T=0;
  72. for (int i=1;i<=llis[0];++i){
  73. if (!match[i]){
  74. ++T;
  75. ans+=check(i);
  76. }
  77. }
  78. int tmp=0;
  79. if (ans<llis[0]) tmp+=(llis[0]-ans)/2*2;
  80. if (ans<rlis[0]) tmp+=(rlis[0]-ans)/2*2;
  81. if ((llis[0]-ans)%2==1) tmp+=3;
  82. printf("%d\n",ans+tmp);
  83. }
  84. int main(){
  85. #ifndef ONLINE_JUDGE
  86. freopen("a.in","r",stdin);
  87. #endif
  88. scanf("%d",&n);
  89. memset(col,0,sizeof(col));
  90. prework(MX-10);
  91. mx=0;
  92. for (int i=1;i<=n;++i){
  93. scanf("%d",inpt+i);
  94. col[inpt[i]]=1;
  95. mx=max(mx,inpt[i]);
  96. }
  97. ++mx;
  98. solve();
  99. }

【arc080F】Prime Flip的更多相关文章

  1. 【ARC080F】Prime Flip 差分+二分图匹配

    Description ​ 有无穷个硬币,初始有n个正面向上,其余均正面向下.  你每次可以选择一个奇质数p,并将连续p个硬币都翻转.  问最小操作次数使得所有硬币均正面向下. Input ​ 第一行 ...

  2. 【CF912E】Prime Game(meet in the middle)

    [CF912E]Prime Game(meet in the middle) 题面 CF 懒得翻译了. 题解 一眼题. \(meet\ in\ the\ middle\)分别爆算所有可行的两组质数,然 ...

  3. 【POJ1811】Prime Test

    [题目大意] 若n是素数,输出“Prime”,否则输出n的最小素因子,(n<=2^54) [题解] 和bzoj3667差不多,知识这道题没那么坑. 直接上Pollord_Rho和Rabin_Mi ...

  4. 【数论】Prime Time UVA - 10200 大素数 Miller Robin 模板

    题意:验证1~10000 的数 n^n+n+41 中素数的个数.每个询问给出a,b  求区间[a,b]中质数出现的比例,保留两位 题解:质数会爆到1e8 所以用miller robin , 另外一个优 ...

  5. 【Poj3126】【BNUOJ3245】Prime Path

    http://poj.org/problem?id=3126 https://www.bnuoj.com/v3/problem_show.php?pid=3245 题目鬼图 刚开始看到题目的图觉得这题 ...

  6. 【leetcode】1072. Flip Columns For Maximum Number of Equal Rows

    题目如下: Given a matrix consisting of 0s and 1s, we may choose any number of columns in the matrix and ...

  7. 【leetcode】926.Flip String to Monotone Increasing

    题目如下: A string of '0's and '1's is monotone increasing if it consists of some number of '0's (possib ...

  8. 【leetcode】951. Flip Equivalent Binary Trees

    题目如下: For a binary tree T, we can define a flip operation as follows: choose any node, and swap the ...

  9. 【LeetCode】294. Flip Game II 解题报告 (C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 记忆化搜索 日期 题目地址:https://leetc ...

随机推荐

  1. Vue学习计划基础笔记(一) - vue实例

    最近又重新看vue的文档了,计划是别人写的,之前看过一次,没有考虑太多,只考虑看懂能用就好.看完之后写过写demo,现在是零实际项目经验的,所以这一次打算细看,算是官方文档的二次产物吧,但是不是全部直 ...

  2. linux上open-vswitch安装和卸载

    一. ovs 从源码编译安装: 安装依赖项: # apt-get install make # apt-get install gcc # apt-get install build-essentia ...

  3. 第1章 Python基础

    一.安装Python windows: 1.下载安装包     https://www.python.org/downloads/ 2.安装     默认安装路径:C:\python27 3.配置环境 ...

  4. ASP.NET MVC - 启动创建项目,未能加载错误

    VS2012以常规方式创建一ASP.NET MVC internet 项目.创建后F5启动项目,遇一错误: 未能加载文件或程序集“MySql.Web.v20, Version=6.9.4.0, Cul ...

  5. 2017软工第十周个人PSP

    11.17--11.23本周例行报告 1.PSP(personal software process )个人软件过程. C(类别) C(内容) ST(开始时间) ET(结束时间) INT(间隔时间) ...

  6. 【Alpha】阶段第五次Scrum Meeting

    [Alpha]阶段第五次Scrum Meeting 工作情况 团队成员 今日已完成任务 明日待完成任务 刘峻辰 增加课程接口 增加教师接口 赵智源 整合前端进行部署 构建后端测试点测试框架 肖萌威 编 ...

  7. PyCharm如何设置源代码字体的大小

    改源代码大小 1.File→Settings→Editor→Colors&Fonts→Font 2.首先得需要Save as一个Scheme,接下来才可以修改字体,名字可以任意取 改运行字体的 ...

  8. 团队Alpha冲刺(四)

    目录 组员情况 组员1(组长):胡绪佩 组员2:胡青元 组员3:庄卉 组员4:家灿 组员5:凯琳 组员6:丹丹 组员7:何家伟 组员8:政演 组员9:鸿杰 组员10:刘一好 组员:何宇恒 展示组内最新 ...

  9. (三)MySQL终极篇

    1.索引 详细介绍:http://www.cnblogs.com/57rongjielong/p/8039452.html 索引是对数据库表中一个或多个列的值进行排序的结构.索引是经过某种算法优化过的 ...

  10. 团队项目-BUG排查-ADT工程 To Android Studio 一整天的排查日记

    4-22 10:44至4-23 0:45 ①打开Eclipse从Github上Clone MathsApp到本机,报错'Unable to resolve target'android-19' ②尝试 ...