[CF888E] Maximum Subsequence 序列分治
早期作品,不喜轻喷。
LG传送门
序列分治板子题。
切这道题用了好长时间,所以想发篇题解作为纪念 。
首先,我们认真观察题目数据(面向数据做题是个好习惯),发现题目的\(n\)竟然只有\(35\),我们顿时感到打暴力的机会来了:
\(2^n\)枚举?
是个好办法。
只可惜我们发现\(2^{35}=34359738368\),并不能过掉所有数据点,于是考虑优化。
分治
考虑把这\(n\)个数分成两组(当然要尽量平均),对两组数据分别实施暴力,并把结果存起来(事实上是可以存下来的:\(2^{18}=262144\))。
void dfs1(int i,int sum){
if(i==b){p[++k]=sum,p[++k]=(sum+a[b])%m; return ;}
dfs1(i+1,sum),dfs1(i+1,(sum+a[i])%m);
}
void dfs2(int i,int sum){
if(i==n){q[++t]=sum,q[++t]=(sum+a[n])%m; return ;}
dfs2(i+1,sum),dfs2(i+1,(sum+a[i])%m);
}
这样一来,我们就得到了原序列分成两半的结果,这两个序列中的数两两组合就可以得到我们要的结果。
等等,两两组合?这样的复杂度不是和纯暴力一样吗?
这时候就需要我们贪心地看问题了:
我们发现:对于序列\(p\)中的每一个数\(p_i\),在序列\(q\)中若能找到一个与之相加小于\(m\)的最大的数\(q_j\),其他所有的与\(p_i\)的和小于\(m\)的数都不会比它更优,即\(q_j\)比序列\(q\)中所有比它小的数都更优。
对于\(q\)中的每一个数,满足相同条件的\(p_i\)也具有同样的性质。
我们想到一种对于\(p,q\)线性的算法:把\(p\)和\(q\)排一遍序,把指向\(p\)数组的指针\(i\)和指向\(q\)数组的指针\(j\)分别按上面所说的条件向右和向左移动,同时更新\(ans\)。
这时我们就只剩下\(p_i+q_j>m\)的情况了,由于在之前已经取过模,\(p_i+q_j\)必定小于\(2m\),所以我们就只需要用\(p,q\)的最大值之和去更新一下\(ans\)就好了。
代码实现
int main(){
R int i,j,ans=0;
n=read(),m=read(),b=n>>1;
for(i=1;i<=n;++i) a[i]=read();
if(n==1) printf("%d",a[1]%m),exit(0);
dfs1(1,0),dfs2(b+1,0),i=0,j=t;
sort(p+1,p+k+1),sort(q+1,q+t+1);
while(i<=k){
while(p[i]+q[j]>=m) --j;
ans=max(ans,p[i]+q[j]),++i;
}
ans=max(ans,p[k]+q[t]-m);
printf("%d",ans);
return 0;
}
注意这里特判了一下\(n=1\)的情况,我被这个点坑了一次。
[CF888E] Maximum Subsequence 序列分治的更多相关文章
- CF888E Maximum Subsequence (Meet in the middle,贪心)
题目链接 Solution Meet in the middle. 考虑到 \(2^{35}\) 枚举会超时,于是分成两半枚举(尽量平均). 然后不能 \(n^2\) 去匹配,需要用到一点贪心: 将数 ...
- CF888E Maximum Subsequence(meet in the middle)
给一个数列和m,在数列任选若干个数,使得他们的和对m取模后最大( \(1<=n<=35\) , \(1<=m<=10^{9}\)) 考虑把数列分成两份,两边分别暴力求出所有的可 ...
- $CF888E\ Maximum\ Subsequence$ 搜索
正解:$meet\ in\ the\ middle$ 解题报告: 传送门$QwQ$. 发现数据范围为$n\leq 35$,所以$2^{\frac{n}{2}}$是可做的. 所以先拆成$A,B$两个集合 ...
- 【CF888E】Maximum Subsequence 折半搜索
[CF888E]Maximum Subsequence 题意:给你一个序列{ai},让你从中选出一个子序列,使得序列和%m最大. n<=35,m<=10^9 题解:不小心瞟了一眼tag就一 ...
- 【CF888E】Maximum Subsequence(meet in the middle)
[CF888E]Maximum Subsequence(meet in the middle) 题面 CF 洛谷 题解 把所有数分一下,然后\(meet\ in\ the\ middle\)做就好了. ...
- 1007. Maximum Subsequence Sum (25)
Given a sequence of K integers { N1, N2, ..., NK }. A continuous subsequence is defined to be { Ni, ...
- PAT - 测试 01-复杂度2 Maximum Subsequence Sum (25分)
1, N2N_2N2, ..., NKN_KNK }. A continuous subsequence is defined to be { NiN_iNi, Ni+1N_{i ...
- PAT 解题报告 1007. Maximum Subsequence Sum (25)
Given a sequence of K integers { N1, N2, ..., NK }. A continuous subsequence is defined to be { Ni, ...
- 中国大学MOOC-陈越、何钦铭-数据结构-2015秋 01-复杂度2 Maximum Subsequence Sum (25分)
01-复杂度2 Maximum Subsequence Sum (25分) Given a sequence of K integers { N1,N2, ..., NK }. ...
随机推荐
- ArcFac_C#_DEMO开发
手上有一个项目,需要检验使用本程序的,是否本人!因为在程序使用前,我们都已经做过头像现场采集,所以源头呢是不成问题的,那么人脸检测,人脸比对,怎么办呢?度娘了下,目前流行的几个人脸检测,人脸比对核心, ...
- Eclipse常用快捷键(持续更新)
编辑相关快捷键 Eclipse的编辑功能非常强大,掌握了Eclipse快捷键功能,能够大大提高开发效率.Eclipse中有如下一些和编辑相关的快捷键. 1.[Ctrl+O] 显示类中方法和属性的大纲, ...
- HDU 1272小希的迷宫(裸并查集,要判断是否构成环,是否是连通图)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1272 小希的迷宫 Time Limit: 2000/1000 MS (Java/Others) ...
- docker 容器不能访问宿主端口原因
因为数据包到了eth0的 上的iptables 表,首先匹配PREROUTING 链,这个拒绝了来自docker0的流量,从而跳到input链,input没有放开服务端口,所以容器访问宿主端口失败;但 ...
- js实现全选、全不选、反选的功能
<!DOCTYPE html> <html> <head> <META charset="utf-8"/> <link rel ...
- oracle 11G dataguard 恢复
检查主备机的sys 密码是否一致,忘记密码可以修改,同步 .alter user sys identified by xxx: orapwd file=oraxxx.ora password=admi ...
- 解决mysql远程登录
MySQL不允许远程登录,所以远程登录失败了,解决方法如下: 在装有MySQL的机器上登录MySQL mysql -u root -p密码 执行use mysql; 执行update user set ...
- jquery中的 append , after , prepend , before 区别
jQuery append() 方法在被选元素的结尾插入内容. jQuery prepend() 方法在被选元素的开头插入内容. jQuery after() 方法在被选元素之后插入内容. jQuer ...
- 用file标签实现多图文件上传预览
效果图: js 代码: <script> //下面用于多图片上传预览功能 function setImagePreviews(avalue) { var docObj = document ...
- [示例] 用代码设置 ListView 颜色 (只适用 Win 平台,无需修改官方源码)
如果可以使用代码随意设置 ListView 的颜色,而不用加载额外的 Style 及修改官方的源码,那该有多好?! 其实 Style 提供了很强了扩充性及可塑性,可以很容易的去操作它. 下面以 Lis ...