Description

Link.

给一个数列和 \(m\),在数列任选若干个数,使得他们的和对 \(m\) 取模后最大。

Solution

记录一下犯下的一个 nt 错误。

首先我们有一个显然的 DFS 暴力,每次两种决策,选或不选,所以时间复杂度为 \(\Theta(2^{n})\)。

\(n\) 的范围是 35,是过不了的,我们可以考虑折半搜索。

关于折半搜索可以看看 我的折半搜索小计

暴力搜出 \([1,\lfloor\frac{n}{2}\rfloor],[\lfloor\frac{n}{2}\rfloor+1,n]\) 的所有答案,记录到两个 vector 里面。

这一部分的时间复杂度是 \(\Theta(2^{\lfloor\frac{n}{2}\rfloor})\)。

考虑合并贡献。

先考虑一个暴力合并贡献的方法。

我们记第一次搜索搜出来的答案序列为 \(A_{1}\),同理有 \(A_{2}\)。

这里的两个答案序列都是在模 \(m\) 意义下的。

那么对于每一个 \(A_{1,i}\),我们都可以暴力在 \(A_{2}\) 中寻找两者相加模 \(m\) 的最大值。

那么我们可以分类讨论了,因为序列在模 \(m\) 意义下,所以我们对于每一个 \(A_{1,i}\) 找到的 \(A_{2,j}\) 使得 \((A_{1,i}+A_{2,j})\bmod m\) 最大,都只有两种情况。

一种是 \(A_{2,j}\) 在 \(A_{2}\) 中值域范围在 \([0,m-A_{1,i}-1]\) 的所有值中最大,一种是在 \(A_{2}\) 中值域范围在 \([0,m\times2-A_{1,i}-1]\) 的所有值中最大。

所以我们在这两种情况中取最大即可。

由于我不理解二分做法,所以我用的是动态开点值域线段树。

(flag:动态开点不加引用就【】)

#include<bits/stdc++.h>
using namespace std;
const int N=35+5;
const int H=99999999;
int n,m,tot=1,root=1,ans,a[N];
struct Tree
{
int ls,rs,val;
} nodes[(1<<(N>>1))<<3];
vector<int> vec[2]; void dfs(int x,int cur,int lim)
{
if(x>lim)
{
if(lim==(n>>1)) vec[0].push_back(cur);
else vec[1].push_back(cur);
return ;
}
dfs(x+1,(cur+a[x])%m,lim);
dfs(x+1,cur,lim);
} void ins(int &p,int l,int r,int x)
{
if(p==0) p=++tot;
if(l==r)
{
nodes[p].val=l;
return ;
}
int mid=(l+r)>>1;
if(mid>=x) ins(nodes[p].ls,l,mid,x);
else ins(nodes[p].rs,mid+1,r,x);
nodes[p].val=max(nodes[nodes[p].ls].val,nodes[nodes[p].rs].val);
} int find(int p,int l,int r,int x,int y)
{
if(l>y||r<x) return 0;
if(l>=x&&r<=y) return nodes[p].val;
int mid=(l+r)>>1,ret=0;
if(mid>=x) ret=max(ret,find(nodes[p].ls,l,mid,x,y));
if(mid<y) ret=max(ret,find(nodes[p].rs,mid+1,r,x,y));
return ret;
} void output(int p)
{
if(nodes[p].ls==0&&nodes[p].rs==0)
{
printf("%d ",nodes[p].val);
return ;
}
output(nodes[p].ls);
output(nodes[p].rs);
} signed main()
{
scanf("%d %d",&n,&m);
for(int i=1;i<=n;++i) scanf("%d",&a[i]);
dfs(1,0,n>>1);
dfs((n>>1)+1,0,n);
sort(vec[0].begin(),vec[0].end());
sort(vec[1].begin(),vec[1].end());
for(auto x:vec[1]) ins(root,0,m-1,x);
for(auto x:vec[0]) ans=max(ans,max(x+find(1,0,m-1,0,m-x-1),(x+find(1,0,m-1,0,m*2-x-1))%m));
printf("%d\n",ans);
return 0;
}

Solution -「CF 888E」Maximum Subsequence的更多相关文章

  1. Solution -「CF 1342E」Placing Rooks

    \(\mathcal{Description}\)   Link.   在一个 \(n\times n\) 的国际象棋棋盘上摆 \(n\) 个车,求满足: 所有格子都可以被攻击到. 恰好存在 \(k\ ...

  2. Solution -「CF 1622F」Quadratic Set

    \(\mathscr{Description}\)   Link.   求 \(S\subseteq\{1,2,\dots,n\}\),使得 \(\prod_{i\in S}i\) 是完全平方数,并最 ...

  3. Solution -「CF 923F」Public Service

    \(\mathscr{Description}\)   Link.   给定两棵含 \(n\) 个结点的树 \(T_1=(V_1,E_1),T_2=(V_2,E_2)\),求一个双射 \(\varph ...

  4. Solution -「CF 923E」Perpetual Subtraction

    \(\mathcal{Description}\)   Link.   有一个整数 \(x\in[0,n]\),初始时以 \(p_i\) 的概率取值 \(i\).进行 \(m\) 轮变换,每次均匀随机 ...

  5. Solution -「CF 1586F」Defender of Childhood Dreams

    \(\mathcal{Description}\)   Link.   定义有向图 \(G=(V,E)\),\(|V|=n\),\(\lang u,v\rang \in E \Leftrightarr ...

  6. Solution -「CF 1237E」Balanced Binary Search Trees

    \(\mathcal{Description}\)   Link.   定义棵点权为 \(1\sim n\) 的二叉搜索树 \(T\) 是 好树,当且仅当: 除去最深的所有叶子后,\(T\) 是满的: ...

  7. Solution -「CF 623E」Transforming Sequence

    题目 题意简述   link.   有一个 \(n\) 个元素的集合,你需要进行 \(m\) 次操作.每次操作选择集合的一个非空子集,要求该集合不是已选集合的并的子集.求操作的方案数,对 \(10^9 ...

  8. Solution -「CF 1023F」Mobile Phone Network

    \(\mathcal{Description}\)   Link.   有一个 \(n\) 个结点的图,并给定 \(m_1\) 条无向带权黑边,\(m_2\) 条无向无权白边.你需要为每条白边指定边权 ...

  9. Solution -「CF 599E」Sandy and Nuts

    \(\mathcal{Description}\)   Link.   指定一棵大小为 \(n\),以 \(1\) 为根的有根树的 \(m\) 对邻接关系与 \(q\) 组 \(\text{LCA}\ ...

  10. Solution -「CF 487E」Tourists

    \(\mathcal{Description}\)   Link.   维护一个 \(n\) 个点 \(m\) 条边的简单无向连通图,点有点权.\(q\) 次操作: 修改单点点权. 询问两点所有可能路 ...

随机推荐

  1. 学习原根 by OI-wiki

    根据 OI-wiki 的讲解,加以自己的理解和简化.偏重于算法竞赛而不是数学竞赛. 前置知识: 费马小定理:\(a^{p-1} \equiv 1(\mod p)\),\(p\) 为质数. 欧拉定理:\ ...

  2. clusterProfiler 的 GO/KEGG 富集分析用法小结

    以下文章来源于简书,作者 biobin,文章已获原作者授权. 前言 关于 clusterProfiler这个 R 包就不介绍了,网红教授宣传得很成功,功能也比较强大,主要是做 GO 和 KEGG 的功 ...

  3. 自然语言处理 Paddle NLP - 信息抽取技术及应用

    1.什么是信息抽取 即自动从无结构或半结构的文本中抽取出结构化信息的任务(病历抽取) 2.实体抽取 3.关系抽取 4.事件抽取 信息抽取和知识图谱是一个上下游的关系.抽取的结果,可以组装成知识图谱(一 ...

  4. 逍遥自在学C语言 | 指针函数与函数指针

    前言 在C语言中,指针函数和函数指针是强大且常用的工具.它们允许我们以更灵活的方式处理函数和数据,进而扩展程序的功能. 本文将介绍指针函数和函数指针的概念,并讲解一些常见的应用示例. 一.人物简介 第 ...

  5. Liunx下对php内核的调试

    0x01前言 主要是对上一篇文章中php_again这道题的补充. 0x02下载php源码 cd /usr/local wget https://www.php.net/distributions/p ...

  6. 记一次 .NET 某医院预约平台 非托管泄露分析

    一:背景 1. 讲故事 前几天有位朋友找到我,说他的程序有内存泄露,让我帮忙排查一下,截图如下: 说实话看到 32bit, 1.5G 这些关键词之后,职业敏感告诉我,他这个可能是虚拟地址紧张所致,不管 ...

  7. 「学习笔记」KMP 算法

    前置知识 前缀 是指从串首开始到某个位置 \(i\) 结束的一个特殊子串. 真前缀 指除了 \(S\) 本身的 \(S\) 的前缀. 举例来说, 字符串 abcabeda 的所有前缀为 {a, ab, ...

  8. vscode中react组件

    通过使用这个插件我们可以很方便的进行组件/方法/文件的导入 本篇博客仅对插件进行介绍翻译,便于自己以后使用 常用片段列表 imr: 引入 React import React from 'react' ...

  9. 【转载】Linux虚拟化KVM-Qemu分析(七)之timer虚拟化

    原文信息 作者:LoyenWang 出处:https://www.cnblogs.com/LoyenWang/ 公众号:LoyenWang 版权:本文版权归作者和博客园共有 转载:欢迎转载,但未经作者 ...

  10. MyBatis理论

    MyBatis简介 MyBatis是什么? MyBatis是一款优秀的持久层框架,一个ORM(对象关系映射)框架,它支持定制化SQL.存储过程以及高级映射.MyBaits避免了几乎所有JDBC代码和手 ...