早期作品,不喜轻喷。

LG传送门

序列分治板子题。

切这道题用了好长时间,所以想发篇题解作为纪念 。

首先,我们认真观察题目数据(面向数据做题是个好习惯),发现题目的\(n\)竟然只有\(35\),我们顿时感到打暴力的机会来了:

\(2^n\)枚举?

是个好办法。

只可惜我们发现\(2^{35}=34359738368\),并不能过掉所有数据点,于是考虑优化。

分治

考虑把这\(n\)个数分成两组(当然要尽量平均),对两组数据分别实施暴力,并把结果存起来(事实上是可以存下来的:\(2^{18}=262144\))。

  1. void dfs1(int i,int sum){
  2. if(i==b){p[++k]=sum,p[++k]=(sum+a[b])%m; return ;}
  3. dfs1(i+1,sum),dfs1(i+1,(sum+a[i])%m);
  4. }
  5. void dfs2(int i,int sum){
  6. if(i==n){q[++t]=sum,q[++t]=(sum+a[n])%m; return ;}
  7. dfs2(i+1,sum),dfs2(i+1,(sum+a[i])%m);
  8. }

这样一来,我们就得到了原序列分成两半的结果,这两个序列中的数两两组合就可以得到我们要的结果。

等等,两两组合?这样的复杂度不是和纯暴力一样吗?

这时候就需要我们贪心地看问题了:

我们发现:对于序列\(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\)就好了。

代码实现

  1. int main(){
  2. R int i,j,ans=0;
  3. n=read(),m=read(),b=n>>1;
  4. for(i=1;i<=n;++i) a[i]=read();
  5. if(n==1) printf("%d",a[1]%m),exit(0);
  6. dfs1(1,0),dfs2(b+1,0),i=0,j=t;
  7. sort(p+1,p+k+1),sort(q+1,q+t+1);
  8. while(i<=k){
  9. while(p[i]+q[j]>=m) --j;
  10. ans=max(ans,p[i]+q[j]),++i;
  11. }
  12. ans=max(ans,p[k]+q[t]-m);
  13. printf("%d",ans);
  14. return 0;
  15. }

注意这里特判了一下\(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. BZOJ1334:[Baltic2008]Elect(背包DP)

    Description N个政党要组成一个联合内阁,每个党都有自己的席位数. 现在希望你找出一种方案,你选中的党的席位数要大于总数的一半,并且联合内阁的席位数越多越好. 对于一个联合内阁,如果某个政党 ...

  2. 1. Docker基础命令

    本文简要介绍Docker的基础命令,目的在于快速入门Dokcer,Docker的完整命令可以参考Docker官方手册. 0. 安装Docker Docker当前分为企业版(Docker Enterpr ...

  3. Odoo中报表PDF样式出错的解决办法

    如果发现生成的pdf样式不对,那可能是wkhtmltopdf没办法访问web服务器导致的.wkhtmltopdf进程使用web.base.url作为根url来生成对应文件路径,但这个地址是每次管理员登 ...

  4. centos上nginx的安装

    安装步骤:   1.下载nginx,执行:wget http://nginx.org/download/nginx-1.10.2.tar.gz 2.解压,执行:tar vxzf nginx-1.10. ...

  5. SpringBoot实战(五)之Thymeleaf

    Thymeleaf同jsp.volocity.freemarker等共同的职能是MVC模式中的视图展示层,即View. 当然了,SpringBoot中也可以用jsp,不过不推荐这种用法,比较推崇的就是 ...

  6. [转]浅谈利用SQLite存储离散瓦片的思路和实现方法

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 在多个项目中涉及到互联网地图的内网显示,通过自制工具完成了互联 ...

  7. 关于python接口基础到进阶随笔

    想了很久,闲来无事,今天想了下还是总结了下写下来,部分参考官方源码理解,还有就是这么久的理解, 如果觉得有帮助请记得点赞 先讲下接口url组成拿后台服务为例 通常一个后台请求url格式: http:/ ...

  8. POJ 2299 Ultra-QuickSort 求逆序数 (归并或者数状数组)此题为树状数组入门题!!!

    Ultra-QuickSort Time Limit: 7000MS   Memory Limit: 65536K Total Submissions: 70674   Accepted: 26538 ...

  9. Spring异步-@Async注解

    Spring异步:@Async注解 使用@Async前需要开启异步支持:@EnableAsync 注解和XML方式 @Async返回值的调用:需要使用Future包装 1.如果没有使用Future包装 ...

  10. 数据库事务ACID特性及隔离级别

    数据库ACID特性介绍 1.原子性(Atomic)一个事务被视为一个不可分割的最小工作单元,这个事务里的所有操作要么全部成功执行,要么全都不执行,不能只执行其中的一部分操作.实现事务的原子性,要支持回 ...