【arc080F】Prime Flip
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
代码大概长这个样子
#include<iostream>
#include<cstdio>
#include<cstring>
#define ll long long
using namespace std;
const int N=210,MX=1e7+10;
struct xxx{
int y,nxt;
}a[N*N*2];
int h[N];
int inpt[N],p[MX],mark[MX],mnp[MX],col[MX],A[MX];
int used[N*2],match[N*2],llis[N*2],rlis[N*2];
int n,m,mx,tot,T,lcnt,rcnt;
ll ans;
void add(int x,int y){a[++tot].y=y; a[tot].nxt=h[x]; h[x]=tot;}
void prework(int n){
int cnt=0;
mnp[1]=1;
mark[1]=1;
for (int i=2;i<=n;++i){
if (!mark[i])
p[++cnt]=i,mnp[i]=i;
for (int j=1;j<=cnt&&i*p[j]<=n;++j){
mark[i*p[j]]=true;
if (i%p[j]==0){
mnp[i*p[j]]=p[j];
break;
}
}
}
}
bool check(int x){
int u;
for (int i=h[x];i!=-1;i=a[i].nxt){
u=a[i].y;
if (used[u]==T) continue;
used[u]=T;
if (!match[u]||check(match[u])){
match[x]=u; match[u]=x;
return true;
}
}
return false;
}
void build(){
int x,y;
memset(h,-1,sizeof(h));
tot=0;
for (int i=1;i<=llis[0];++i){
x=llis[i];
for (int j=1;j<=rlis[0];++j){
y=rlis[j];
if (mark[abs(x-y)]) continue;
add(i,j+llis[0]);
add(j+llis[0],i);
}
}
}
void solve(){
llis[0]=0; rlis[0]=0;
int tmpcnt=0;
for (int i=1;i<=mx;++i)
if (col[i]!=col[i-1]){
if (i&1)
rlis[++rlis[0]]=i;
else
llis[++llis[0]]=i;
++tmpcnt;
}
build();
T=0;
for (int i=1;i<=llis[0];++i){
if (!match[i]){
++T;
ans+=check(i);
}
}
int tmp=0;
if (ans<llis[0]) tmp+=(llis[0]-ans)/2*2;
if (ans<rlis[0]) tmp+=(rlis[0]-ans)/2*2;
if ((llis[0]-ans)%2==1) tmp+=3;
printf("%d\n",ans+tmp);
}
int main(){
#ifndef ONLINE_JUDGE
freopen("a.in","r",stdin);
#endif
scanf("%d",&n);
memset(col,0,sizeof(col));
prework(MX-10);
mx=0;
for (int i=1;i<=n;++i){
scanf("%d",inpt+i);
col[inpt[i]]=1;
mx=max(mx,inpt[i]);
}
++mx;
solve();
}
【arc080F】Prime Flip的更多相关文章
- 【ARC080F】Prime Flip 差分+二分图匹配
Description 有无穷个硬币,初始有n个正面向上,其余均正面向下. 你每次可以选择一个奇质数p,并将连续p个硬币都翻转. 问最小操作次数使得所有硬币均正面向下. Input 第一行 ...
- 【CF912E】Prime Game(meet in the middle)
[CF912E]Prime Game(meet in the middle) 题面 CF 懒得翻译了. 题解 一眼题. \(meet\ in\ the\ middle\)分别爆算所有可行的两组质数,然 ...
- 【POJ1811】Prime Test
[题目大意] 若n是素数,输出“Prime”,否则输出n的最小素因子,(n<=2^54) [题解] 和bzoj3667差不多,知识这道题没那么坑. 直接上Pollord_Rho和Rabin_Mi ...
- 【数论】Prime Time UVA - 10200 大素数 Miller Robin 模板
题意:验证1~10000 的数 n^n+n+41 中素数的个数.每个询问给出a,b 求区间[a,b]中质数出现的比例,保留两位 题解:质数会爆到1e8 所以用miller robin , 另外一个优 ...
- 【Poj3126】【BNUOJ3245】Prime Path
http://poj.org/problem?id=3126 https://www.bnuoj.com/v3/problem_show.php?pid=3245 题目鬼图 刚开始看到题目的图觉得这题 ...
- 【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 ...
- 【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 ...
- 【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 ...
- 【LeetCode】294. Flip Game II 解题报告 (C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 记忆化搜索 日期 题目地址:https://leetc ...
随机推荐
- Web性能测试篇:AB 压力测试
1. 压力测试的概念\定义 1.这段话是给刚接触\学习性能测试知识的初学者,在实际工作中都会接触到性能测试.压力测试.负载测试等专业名词也容易混淆,下面带大家熟悉下这到底是怎么定义: 1.1.性能测试 ...
- 卡特兰数(Catalan)及其应用
卡特兰数 大佬博客https://blog.csdn.net/doc_sgl/article/details/8880468 卡特兰数是组合数学中一个常出现在各种计数问题中出现的数列. 卡特兰数前几项 ...
- SSH 框架的心得
使用SSH框架做完了一个普通网站的前后台项目,成热写点心得,免得以后再入坑.其中使用 Strust2 2.3.33 + Spring 4.3.9 + Hibernate 5.2.10 eclipse ...
- iOS- 利用AFNetworking(AFN) - 实现文件上传
官方建议AFN的使用方法 1. 定义一个全局的AFHttpClient:包含有 1> baseURL 2> 请求 3> 操作队列 NSOperationQueue 2. 由AFHTT ...
- Swift-属性监听
监听属性的改变(开发中使用很多) oc中长是重写set方法 swift通过属性监听器 class Dog: NSObject { var name:String?{ // 属性监听器 // 属性即将改 ...
- 把a文件删除b文件中的相同的行
grep -vxFf b.txt a.txt > newa.txt 更好的方法是 comm - - b.txt a.txt > newa.txt 来自Tool in unix to sub ...
- NFS 它的目的就是想让不同的机器、不同的作业系统可以彼此分享个别的档案啦
NFS即网络文件系统,是FreeBSD支持的文件系统中的一种,它允许网络中的计算机之间通过TCP/IP网络共享资源.在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件, ...
- 0302借软件工程触IT
没有不想学好的学生,也没有选择计算机软件专业后不想过能进军IT的行业的.就对于自己情况来说,大学选择计算机商业软件专业学习也有一年多时间了,未接触专业知识前IT是一个高大上的向往,在初学C语 ...
- 201621123037 《Java程序设计》第1周学习总结
#作业01-Java基本概念 1. 本周学习总结 本周学习内容JDK JVM JRE 跨平台 .java .class 关键概念之间的联系: 总的来讲JDK是给开发人员们提供专门用来开发的环境,并且包 ...
- 转 maven3常用命令、java项目搭建、web项目搭建详细图解
转自地址:http://blog.csdn.net/edward0830ly/article/details/8748986 ------------------------------maven3常 ...