早期作品,不喜轻喷。

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 序列分治的更多相关文章

  1. CF888E Maximum Subsequence (Meet in the middle,贪心)

    题目链接 Solution Meet in the middle. 考虑到 \(2^{35}\) 枚举会超时,于是分成两半枚举(尽量平均). 然后不能 \(n^2\) 去匹配,需要用到一点贪心: 将数 ...

  2. CF888E Maximum Subsequence(meet in the middle)

    给一个数列和m,在数列任选若干个数,使得他们的和对m取模后最大( \(1<=n<=35\) , \(1<=m<=10^{9}\)) 考虑把数列分成两份,两边分别暴力求出所有的可 ...

  3. $CF888E\ Maximum\ Subsequence$ 搜索

    正解:$meet\ in\ the\ middle$ 解题报告: 传送门$QwQ$. 发现数据范围为$n\leq 35$,所以$2^{\frac{n}{2}}$是可做的. 所以先拆成$A,B$两个集合 ...

  4. 【CF888E】Maximum Subsequence 折半搜索

    [CF888E]Maximum Subsequence 题意:给你一个序列{ai},让你从中选出一个子序列,使得序列和%m最大. n<=35,m<=10^9 题解:不小心瞟了一眼tag就一 ...

  5. 【CF888E】Maximum Subsequence(meet in the middle)

    [CF888E]Maximum Subsequence(meet in the middle) 题面 CF 洛谷 题解 把所有数分一下,然后\(meet\ in\ the\ middle\)做就好了. ...

  6. 1007. Maximum Subsequence Sum (25)

    Given a sequence of K integers { N1, N2, ..., NK }. A continuous subsequence is defined to be { Ni, ...

  7. PAT - 测试 01-复杂度2 Maximum Subsequence Sum (25分)

    1​​, N2N_2N​2​​, ..., NKN_KN​K​​ }. A continuous subsequence is defined to be { NiN_iN​i​​, Ni+1N_{i ...

  8. PAT 解题报告 1007. Maximum Subsequence Sum (25)

    Given a sequence of K integers { N1, N2, ..., NK }. A continuous subsequence is defined to be { Ni, ...

  9. 中国大学MOOC-陈越、何钦铭-数据结构-2015秋 01-复杂度2 Maximum Subsequence Sum (25分)

    01-复杂度2 Maximum Subsequence Sum   (25分) Given a sequence of K integers { N​1​​,N​2​​, ..., N​K​​ }. ...

随机推荐

  1. BZOJ5072:[Lydsy1710月赛]小A的树(树形DP)

    Description BZOJ只是扔了个下载链接 Solution 设$f[x][i]$表示$x$点选中$i$个黑点的最小连通块. 设$g[x][i]$表示$x$点选中$i$个黑点的最大连通块. 转 ...

  2. 3504. [CQOI2014]危桥【最大流】

    Description Alice和Bob居住在一个由N座岛屿组成的国家,岛屿被编号为0到N-1.某些岛屿之间有桥相连,桥上的道路是双 向的,但一次只能供一人通行.其中一些桥由于年久失修成为危桥,最多 ...

  3. [USACO09MAR]Look Up

    嘟嘟嘟 题面说的有点问题,应该是向后看齐. 于是我们维护一个单调递减栈,如果当前a[i]比栈顶元素大,就执行pop操作,然后把pop出来的元素的答案都用 i 更新即可. #include<cst ...

  4. 【vue】饿了么项目-页面骨架开发

    1.页面骨架开发 1.1组件拆分 手机浏览器是把页面放在一个虚拟的“窗口”(viewport)中,通常这个虚拟的“窗口”(viewport)比屏幕宽,这样就不用把每个网页挤到很小的窗口中(这样会破坏没 ...

  5. 35、springboot-运行状态监控使用Actuator

    Spring Boot Actuator 提供了运行状态监控的功能 Actuator 监控数据可以通过阻REST远程 shell 和JMX方式获得.我 首先来介绍通过 REST 方式查看 Actuat ...

  6. python之使用__future__

    Python的新版本会引入一些新的功能特性,但一般一部分的新功能可以在旧版本上测试,测试成功再移植到新的版本上,旧版本可以通过导入__future__模块的某些功能,测试新版本的新功能.(注意:fut ...

  7. deque详解

    deque是double-ended queue的简称,deque和vector几乎上是一样的,使用的非常少,定义在<deque>头文件里: deque和vector的区别在于: 1)de ...

  8. Spring@PostConstruct注解和构造方法的调用顺序

    先看下@PostConstruct的注解 * The PostConstruct annotation is used on a method that needs to be executed * ...

  9. Mac 下 SVN 的使用

    在Windows环境中,我们一般使用TortoiseSVN来搭建svn环境.在Mac环境下,由于Mac自带了svn的服务器端和客户端功能,所以我们可以在不装任何第三方软件的前提下使用svn功能,不过还 ...

  10. UVALive - 2515 (最小生成树 kruskal)

    You are assigned to design network connections between certain points in a wide area. You are given ...