构造一个数组$b_{i}$(初始为0),对于操作$[l_{i},r_{i}]$,令$b_{l_{i}}$和$b_{r_{i}+1}$值异或1,表示$i$和$i-1$的差值发生改变,最终即要求若干个$b_{i}$为1,其余为0

对于一组合法方案,通过重新排列操作的顺序,使得每一次操作都有至少一个修改是$b_{i}$由1变为0,然后进行以下构造:

1.仅有1个$b_{i}$由1变为0(即另一个$b_{i}$是由0变成1),我们将其称之为移动,即将这个$b_{i}$移动到了另一个位置,其中移动的距离必须为奇素数

2.两个都由1变为0,可以看作移动到了与另一个1相同的位置上,那么就可以消除,称之为匹配,显然每一个初始为1的位置出现且仅出现在一个匹配内

根据匹配的独立性,对于一组给定的匹配方式,即求每一对数$(x,y)$相同所需要的最小次数之和,同时由于加减互为逆运算,可以看作由$x$变为$y$(即不移动$y$)

求$x$变为$y$的最小次数,对$x$和$y$分类讨论:

1.$x=y$,答案为0

2.$|y-x|$为奇素数,答案为1

3.$|y-x|$为偶数,根据哥德巴赫猜想,答案为2(特别的,2=5-3)

4.$|y-x|$为其他情况,选择一个比其小的奇素数,剩下的偶数部分再分为两个奇素数,因此答案为3(特别的,1=3+3-5,3和5都为素数,是第2种情况)

对于第1种情况,直接贪心匹配,即对于一个连续的$a_{i}$,只需要记录左端点和右端点+1即可

假设初始为1的位置中,有$x$个奇数,$y$个偶数,然后选择了$k$对奇偶使得差为奇素数,然后对于剩下的显然尽量使用第3种,答案即$k+2(\lfloor\frac{x-k}{2}\rfloor+\lfloor\frac{y-k}{2}\rfloor)+3((x-k)mod\ 2)$

由于$2\lfloor\frac{x-k}{2}\rfloor=x-k-(x-k)mod\ 2$,同时$x-k\equiv y-k(mod\ 2)$(1总数为偶数),因此可以化简为$x+y-k+((x-k)mod\ 2)$

当$k$增大后上式一定单调不减,因此仅连奇素数的边,求最大匹配即可,时间复杂度为$o(n^{2})$

 1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 205
4 #define M 10000005
5 struct ji{
6 int nex,to;
7 }edge[N*N*2];
8 vector<int>v;
9 int E,n,x,ans,p[M],vis[M],a[N],head[N],match[N];
10 void add(int x,int y){
11 edge[E].nex=head[x];
12 edge[E].to=y;
13 head[x]=E++;
14 }
15 bool dfs(int k){
16 if (vis[k])return 0;
17 vis[k]=1;
18 for(int i=head[k];i!=-1;i=edge[i].nex)
19 if ((match[edge[i].to]==-1)||(dfs(match[edge[i].to]))){
20 match[k]=edge[i].to;
21 match[edge[i].to]=k;
22 return 1;
23 }
24 return 0;
25 }
26 int main(){
27 for(int i=2;i<M-4;i++){
28 if (!vis[i])p[++p[0]]=i;
29 for(int j=1;(j<=p[0])&&(i*p[j]<M-4);j++){
30 vis[i*p[j]]=1;
31 if (i%p[j]==0)break;
32 }
33 }
34 vis[0]=vis[1]=vis[2]=1;
35 scanf("%d",&n);
36 for(int i=1;i<=n;i++){
37 scanf("%d",&x);
38 a[2*i-1]=x;
39 a[2*i]=x+1;
40 }
41 n*=2;
42 sort(a+1,a+n+1);
43 for(int i=1;i<=n;i++)
44 if (((i==1)||(a[i]!=a[i-1]))&&((i==n)||(a[i]!=a[i+1])))v.push_back(a[i]);
45 n=v.size(),x=0;
46 for(int i=0;i<n;i++)
47 if (v[i]&1)x++;
48 memset(head,-1,sizeof(head));
49 for(int i=0;i<n;i++)
50 for(int j=0;j<n;j++)
51 if (!vis[abs(v[i]-v[j])])add(i,j);
52 memset(match,-1,sizeof(match));
53 for(int i=0;i<n;i++)
54 if (v[i]&1){
55 memset(vis,0,sizeof(vis));
56 ans+=dfs(i);
57 }
58 printf("%d",n-ans+((ans&1)!=(x&1)));
59 }

[atARC080F]Prime Flip的更多相关文章

  1. [Arc080F]Prime Flip

    [Arc080F]Prime Flip Description 你有无限多的"给给全",编号为1,2,3,....开始时,第x1,x2,...,xN个"给给全" ...

  2. Prime Flip AtCoder - 2689

    发现我们每次区间取反,相邻位置的正反关系只有两个位置发生改变 我们定义bi为ai和ai-1的正反关系,即ai=ai-1时bi=0,否则bi=1,每次取反l~r,b[l]和b[r+1]会发生改变 容易发 ...

  3. AT2689 [ARC080D] Prime Flip

    简要题解如下: 区间修改问题,使用差分转化为单点问题. 问题变成,一开始有 \(2n\) 个点为 \(1\),每次操作可以选择 \(r - l\) 为奇质数的两个点 \(l, r\) 使其 ^ \(1 ...

  4. 【arc080F】Prime Flip

    Portal --> arc080_f Solution ​  这题的话..差分套路题(算吗?反正就是想到差分就很好想了qwq) ​​  (但是问题就是我不会这种套路啊qwq题解原话是:&quo ...

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

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

  6. 【Atcoder】ARC 080 F - Prime Flip

    [算法]数论,二分图最大匹配 [题意]有无限张牌,给定n张面朝上的牌的坐标(N<=100),其它牌面朝下,每次操作可以选定一个>=3的素数p,并翻转连续p张牌,求最少操作次数使所有牌向下. ...

  7. AT2689 Prime Flip

    传送门 这个题是真的巧妙 首先一个很巧妙的思路,差分 考虑假如\(a_i!=a_{i-1}\),则\(b_i=1\),否则\(b_i=0\) 这样一来,一个区间的翻转就变成了对于两个数的取反了 然后我 ...

  8. Java基础之写文件——从多个缓冲区写(GatheringWrite)

    控制台程序,使用单个写操作将数据从多个缓冲区按顺序传输到文件,这称为集中写(GatheringWrite)操作.这个功能的优势是能够避免在将信息写入到文件中之前将信息复制到单个缓冲区中.从每个缓冲区写 ...

  9. Atcoder 乱做

    最近感觉自己思维僵化,啥都不会做了-- ARC103 F Distance Sums 题意 给定第 \(i\) 个点到所有点的距离和 \(D_i\) ,要求构造一棵合法的树.满足第 \(i\) 个点到 ...

随机推荐

  1. MyCat的快速搭建

    1. 概述 老话说的好:一个好汉三个帮,一个人再聪明.再有本事,也要借助他人的力量,才能成功. 言归正传,今天我们来聊聊 MyCat的快速搭建. 2. 场景介绍 服务器A IP:192.168.1.2 ...

  2. bzoj3073Journeys(线段树优化最短路)

    这里还是一道涉及到区间连边的问题. 如果暴力去做,那么就会爆炸 那么这时候就需要线段树来优化了. 因为是双向边 所以需要两颗线段树来分别对应入边和出边 QwQ然后做就好了咯 不过需要注意的是,这个边数 ...

  3. OutOfMemoryException异常解析

    一.概述 在国庆休假快结束的最后一天晚上接到了部门老大的电话,某省的服务会出现崩溃问题.需要赶紧修复,没错这次的主角依旧是上次的"远古项目"没有办法同事都在休假没有人能帮忙开电脑远 ...

  4. 返回值优化 RVO

    <深度探索C++对象模型>-- 2.3 返回值的初始化 & 在编译器层面做优化

  5. 痞子衡嵌入式:超级下载算法RT-UFL v1.0在Keil MDK下的使用

    痞子衡主导的"学术"项目 <RT-UFL - 一个适用全平台i.MXRT的超级下载算法设计> v1.0 版发布近 4 个月了,部分客户已经在实际项目开发调试中用上了这个 ...

  6. Sequence Model-week2编程题2-Emoji表情生成器

    1. Emoji表情生成器 下面,我们要使用词向量(word vector)来构建一个表情生成器. 你将实现一个模型:输入一句话 (如 "Let's go see the baseball ...

  7. 替换excel模板中的内容并使用JavaMail发送邮件

    由于在公司工作,常年出差,每天都要以日报的形式向公司汇报当天的工作内容.而日报的内容大体上就只有当天工作的主要内容时变化的,其余的都是不变 的. 而我的电脑刚打开excel有点卡,因此决定使用Java ...

  8. elasticsearch嵌套对象的映射

    在es中,我们有时候可能需要映射,{ "field" : "xx" , "field01" : [] }这样格式的嵌套对象,默认情况下es会 ...

  9. STL模板

    目录 栈stack 队列queue 列表List 集合set 映射map 多重映射multimap 对pair 元组tuple 容器containers 算法algorithms 仿函数/函数对象fu ...

  10. AOP源码解析:AspectJExpressionPointcutAdvisor类

    先看看 AspectJExpressionPointcutAdvisor 的类图 再了解一下切点(Pointcut)表达式,它指定触发advice的方法,可以精确到返回参数,参数类型,方法名 1 pa ...