Solution -「CF 888E」Maximum Subsequence
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的更多相关文章
- Solution -「CF 1342E」Placing Rooks
\(\mathcal{Description}\) Link. 在一个 \(n\times n\) 的国际象棋棋盘上摆 \(n\) 个车,求满足: 所有格子都可以被攻击到. 恰好存在 \(k\ ...
- Solution -「CF 1622F」Quadratic Set
\(\mathscr{Description}\) Link. 求 \(S\subseteq\{1,2,\dots,n\}\),使得 \(\prod_{i\in S}i\) 是完全平方数,并最 ...
- Solution -「CF 923F」Public Service
\(\mathscr{Description}\) Link. 给定两棵含 \(n\) 个结点的树 \(T_1=(V_1,E_1),T_2=(V_2,E_2)\),求一个双射 \(\varph ...
- Solution -「CF 923E」Perpetual Subtraction
\(\mathcal{Description}\) Link. 有一个整数 \(x\in[0,n]\),初始时以 \(p_i\) 的概率取值 \(i\).进行 \(m\) 轮变换,每次均匀随机 ...
- Solution -「CF 1586F」Defender of Childhood Dreams
\(\mathcal{Description}\) Link. 定义有向图 \(G=(V,E)\),\(|V|=n\),\(\lang u,v\rang \in E \Leftrightarr ...
- Solution -「CF 1237E」Balanced Binary Search Trees
\(\mathcal{Description}\) Link. 定义棵点权为 \(1\sim n\) 的二叉搜索树 \(T\) 是 好树,当且仅当: 除去最深的所有叶子后,\(T\) 是满的: ...
- Solution -「CF 623E」Transforming Sequence
题目 题意简述 link. 有一个 \(n\) 个元素的集合,你需要进行 \(m\) 次操作.每次操作选择集合的一个非空子集,要求该集合不是已选集合的并的子集.求操作的方案数,对 \(10^9 ...
- Solution -「CF 1023F」Mobile Phone Network
\(\mathcal{Description}\) Link. 有一个 \(n\) 个结点的图,并给定 \(m_1\) 条无向带权黑边,\(m_2\) 条无向无权白边.你需要为每条白边指定边权 ...
- Solution -「CF 599E」Sandy and Nuts
\(\mathcal{Description}\) Link. 指定一棵大小为 \(n\),以 \(1\) 为根的有根树的 \(m\) 对邻接关系与 \(q\) 组 \(\text{LCA}\ ...
- Solution -「CF 487E」Tourists
\(\mathcal{Description}\) Link. 维护一个 \(n\) 个点 \(m\) 条边的简单无向连通图,点有点权.\(q\) 次操作: 修改单点点权. 询问两点所有可能路 ...
随机推荐
- 理解ASP.NET Core - 全球化&本地化&多语言(Globalization and Localization)
注:本文隶属于<理解ASP.NET Core>系列文章,请查看置顶博客或点击此处查看全文目录 概述 在众多知名品牌的网站中,比如微软官网.YouTube等,我们经常可以见到"切换 ...
- Helm实战案例一:在Kubernetes上使用Helm搭建Prometheus Operator监控
目录 一.系统环境 二.前言 三.Prometheus Operator简介 四.helm安装prometheus-operator 五.配置prometheus-operator 5.1 修改gra ...
- 计算机视觉重磅会议VAlSE2023召开,合合信息分享智能文档处理技术前沿进展
近期,2023年度视觉与学习青年学者研讨会 (Vision And Learning SEminar, VALSE) 圆满落幕.会议由中国人工智能学会.中国图象图形学学会主办,江南大学和无锡国家高新技 ...
- jenkins 发版获取镜像仓库中tag
一.安装阿里云linux客户端工具 选择官网下载地址 # wget wget https://aliyuncli.alicdn.com/aliyun-cli-linux-latest-amd64.tg ...
- HTML5新特性之Web Storage
Web Storage是HTML5新增的特性,能够在本地浏览器存储数据,对数据的操作很方便,最大能够存储5M. Web Storage有两种类型: SessionStorage 和 LocalStor ...
- 机器翻译技术的发展趋势:从API到深度学习
目录 机器翻译技术的发展趋势:从API到深度学习 随着全球化的发展,机器翻译技术在各个领域得到了广泛的应用.机器翻译技术的核心是将源语言文本翻译成目标语言文本,其中涉及到语言模型.文本生成模型和翻译模 ...
- Android BottomNavigation底部导航栏使用
原文地址: Android BottomNavigation底部导航栏使用 - Stars-One的杂货小窝 基本使用 本文侧重点记录一些特殊的样式设置,所以基本使用这里就简单概述一下,详细图文可以去 ...
- 即构SDK支持对焦、变焦、曝光调整,让直播细节清晰呈现
对焦.变焦.曝光调整,摄影爱好者对这三个术语一定不陌生. 对焦是指通过相机对焦机构变动物距和相距的位置,使被拍物成像清晰的过程:变焦指的是在望远拍摄时放大远方物体,并使之清晰成像 :曝光调整是一种曝光 ...
- Windows 交叉编译之 make
以下内容为本人的学习笔记,如需要转载,请声明原文链接微信公众号「ENG八戒」https://mp.weixin.qq.com/s/w8YV_TUb4QwsgChu3AspHg Make 是什么 Mak ...
- 私网部署DNS(BIND)笔记
准备工作 下载 yum install -y bind bind-utils包含dig.nslookup等调试命令,非必须. yum install -y bind-utils 防火墙 firewal ...