codeforces1045B Space Isaac 【manacher】【差分】
题目大意:
题目是将$[0,m)$的数划成了两个集合,其中一个集合的元素个数不超过$n$。问在第一个集合中选出的数加上第二个集合中选出的数的和中没有出现的数有哪些。
题目分析:
很有意思的一道题。方便起见,接下来的所有表述在模意义下进行。选出的数集合用$a_1 \sim a_n$表示
考虑给出的集合,$k$无法由两个集合中任选一个数的和表示等价于对于给出的集合元素$a_i$,$k-a_i$也在给出的集合之中。
这样来看答案不会超过$n$。也就是你对选出的集合中最小的数考虑,它与另一个选出的数配对。且每个选出的数都能这样配对。
假设你现在让$a_1$与$a_i$配对,那么$a_2 \sim a_{i-1}$必然首尾配对。且$a_{i+1}$一定与$a_n$配对,否则$a_n$找不到配对对象。
这样我们将问题化为了两个环。内部要与最外层答案一致意味着从左到右增加了$k$,那么从右到左也要减少$k$,换句话说它的差分数组是回文的。
所以manacher判回文就行了。
代码:
#include<bits/stdc++.h>
using namespace std; const int maxn = ; int n,m;
int a[maxn],x[maxn],ans[maxn],num; int ss[maxn*],f[maxn*],ct,rr; void read(){
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++) scanf("%d",&a[i]);
} void manacher(){
for(int i=;i<=n;i++) ss[i*] = x[i];
for(int i=;i<=n;i++) ss[i*-] = -; // to replace '$'
ss[*n+] = -; f[] = ,rr = ,ct = ;
for(int i=;i<=*n+;i++){
if(rr < i) f[i] = ; else f[i] = min(rr-i+,f[*ct-i]);
while(i+f[i]<=*n+&&i-f[i]>=&&ss[i+f[i]]==ss[i-f[i]])f[i]++;
if(i+f[i]- > rr) ct = i,rr = i+f[i]-;
}
} int chk(int l,int r){
if(l >= r) return ;
int cent = l+r;
int ll = cent-f[cent]+,rr = cent+f[cent]-;
if(ll <= *l && rr >= *r) return ;
else return ;
} void work(){
for(int i=;i<=n;i++) x[i] = a[i] - a[i-];
if(n == ){printf("1\n%d",(a[]+a[])%m);return;}
manacher();
for(int i=;i<n;i++){
if((a[] + a[i])%m == (a[i+] + a[n])%m){
if(chk(,i)&&chk(i+,n)){
ans[++num] = (a[]+a[i])%m;
}
}else continue;
}
if(chk(,n)){ans[++num] = (a[]+a[n])%m;}
sort(ans+,ans+num+);
printf("%d\n",num);
for(int i=;i<=num;i++){
printf("%d ",ans[i]);
}
} int main(){
read();
work();
return ;
}
codeforces1045B Space Isaac 【manacher】【差分】的更多相关文章
- Codeforces 1045B Space Isaac
Space Isaac 我们定义第一个集合为a, 第二个集合为b 先把a数组排序, 然后我们会以线段的形式得到b集合. 我们先用a[ 1 ]去和 b 中的元素结合, 只有size(a) 个数字未被覆盖 ...
- HDU5785 manacher+差分数组
用manacher算法O(n)求出所有的回文半径.有了回文半径后,就可以求出L[i]表示以i结尾的回文串的起始位置的和R[i]表示以i起始的回文串的结尾位置的和,然后就可以求出答案了,这里要注意奇偶长 ...
- Codeforces 1045B Space Isaac - 数论 - Hash
题目传送门 传送门I 传送门II 传送门III 题目大意 给定将$\left \{ 0, 1, \dots, m - 1\right \}$分成了不相交的两个非空集合$A$和$B$,给定$A$,问存在 ...
- CF1045B Space Isaac(乱搞)
翻译 有0~m-1的数被分成了两个集合每次你可以从两个集合中任取一个数做加法并对m取模问最后0~m-1中不能被组合出来的数有多少个会给出你A集合 大小不超过200000m<=1e9 完了题解都看 ...
- CF1045B Space Isaac
原题链接 DOWNLOAD AS PDF 题目大意 \(0\sim m-1\)的数被分成两个集合,你可以分别从两个集合中取一个数相加并对\(m\)取模,求一不能构造出的数. 题解 感觉如果\(\col ...
- Noip前的大抱佛脚----赛前任务
赛前任务 tags:任务清单 前言 现在xzy太弱了,而且他最近越来越弱了,天天被爆踩,天天被爆踩 题单不会在作业部落发布,所以可(yi)能(ding)会不及时更新 省选前的练习莫名其妙地成为了Noi ...
- 【学习笔记】字符串—马拉车(Manacher)
[学习笔记]字符串-马拉车(Manacher) 一:[前言] 马拉车用于求解连续回文子串问题,效率极高. 其核心思想与 \(kmp\) 类似:继承. --引自 \(yyx\) 学姐 二:[算法原理] ...
- codeforce1046 Bubble Cup 11 - Finals 题解
比赛的时候开G开了3h结果rose说一句那唯一一个AC的是羊的心态就崩了.. 这套题感觉质量挺好然后就back了下 A: AI robots 有三个限制条件:相互能够看见和智商的差.使用主席树,可以维 ...
- Bubble Cup 11 - Finals [Online Mirror, Div. 1]题解 【待补】
Bubble Cup 11 - Finals [Online Mirror, Div. 1] 一场很好玩的题啊! I. Palindrome Pairs 枚举哪种字符出现奇数次. G. AI robo ...
随机推荐
- java使用Map做缓存你真的用对了吗?弱引用WeakHashMap了解一下
目录 关于缓存我们应该考虑什么?-intsmaze WeakHashMap弱引用-intsmaze 线程安全问题-intsmaze Collections-intsmaze ThreadLocal-i ...
- linux if -d -e -f表达的意思
文件表达式-e filename 如果 filename存在,则为真-d filename 如果 filename为目录,则为真 -f filename 如果 filename为常规文件,则为真-L ...
- rest_framework之视图及源码剖析
最初形态(工作中可能会使用) 引子 Django的CBV我们应该都有所了解及使用,大体概括一下就是通过定义类并在类中定义get post put delete等对应于请求方法的方法,当请求来的时候会自 ...
- c语言之sizeof的细节
关于sizeof,我们知道sizeof并不是一个函数,尽管通常我们会用sizeof()用法(这是c语言的坑),在此关于sizeof的一些关键不被认知的进行一下总结: # include "i ...
- C#跨进程读取listview控件中的数据
http://www.cnblogs.com/Charltsing/p/slv32.html 欢迎交流:QQ564955427 读取标准的32位listview控件中的数据,网上已经有很多代码了.今天 ...
- 关于oracle设置主键自增的问题
关于orcale设置主键自增的问题 关于主键Oracle中并没有提供一个直接的语句设置,对于这个oralce一般都是用序列和触发器来实现 一下又两种方法来实现 一 ,不使用触发器 创建序列: crea ...
- 文本文档中各字母出现次数汇总(java)
package 字母频率统计; import java.io.*; public class Inputfile { public static void main(String args[]) { ...
- ORACLE 当字段中有数据如何修改字段类型
创建视图的时候,因为表太多,里面一些字段类型不一样,PL/SQL报错,为‘表达式必须具有对应表达式相同的数据类型’,发现后,一个字段的类型为CLOB和VARCHAR2(4000)两种,将CLOB进行修 ...
- [转帖]nginx配置ssl加密(单/双向认证、部分https)
nginx配置ssl加密(单/双向认证.部分https) https://segmentfault.com/a/1190000002866627 nginx下配置ssl本来是很简单的,无论是去认证 ...
- 【学亮IT手记】利用字节流复制文件