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\) 次操作: 修改单点点权. 询问两点所有可能路 ...
随机推荐
- WPF 入门笔记 - 03 - 样式基础及模板
程序的本质 - 数据结构 + 算法 本篇为学习李应保老师所著的<WPF专业编程指南>并搭配WPF开发圣经<WPF编程宝典第4版>以及痕迹大佬<WPF入门基础教程系列> ...
- cmake 安装一个目录下的图片 到另一个目录文件中去
install(DIRECTORY ./cfg/labels/ DESTINATION ./fservo/cfg/yolo_cfg/labels/) install (DIRECTORY ./cfg/ ...
- Linux系统基础知识与自学方法
Linux系统基础知识与自学方法 大部分非计算机相关的朋友也经常使用电脑,所以我们频繁接触的是Windows系统.关于这个系统的评价不一,一部分人觉得简洁快捷,一部分人觉得问题(病毒.弹窗)多多,总之 ...
- 5. Mybatis获取参数值的两种方式
MyBatis 获取参数值的两种方式:${} 和 #{} ${}的本质就是字符串拼接,#{}的本质就是占位符赋值 ${}使用字符串拼接的方式拼接 sql,若为字符串类型或日期类型的字段进行赋值 ...
- .NET Core 允许跨域的两种方式实现(IIS 配置、C# 代码实现)
〇.前言 当把开发好的 WebApi 接口,部署到 Windows 服务器 IIS 后,postman 可以直接访问到接口并正确返回,这并不意味着任务完成,毕竟接口嘛是要有交互的,最常见的问题莫过于跨 ...
- 每日一题 力扣 1377 https://leetcode.cn/problems/frog-position-after-t-seconds/
力扣 1377 https://leetcode.cn/problems/frog-position-after-t-seconds/ 这道题目用dp去做,构建邻接矩阵,做的时候需要注意题目条件,如果 ...
- 为什么 kubelet 不使用容器化部署?
每日一问系列 为什么 kubelet 不使用容器化部署? 通过脚本(shell/ansible 等)在节点上部署 kubelet 服务时,涉及 kubelet 进程 service 启动配置.证书等, ...
- Java扩展Nginx之六:两大filter
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本文是<Java扩展Nginx> ...
- 数据标注工具 Label-Studio
文档抽取任务Label Studio使用指南 目录 1. 安装 2. 文档抽取任务标注 2.1 项目创建 2.2 数据上传 2.3 标签构建 2.4 任务标注 2.5 数据导出 2.6 数据转换 2. ...
- linux内核编译基础知识储备 --- 过渡篇(四)
文章目录 一. 一种makefile中定义函数的方式 二. makefile之if函数 三. MAKE变量 四. $(quiet) 4.1 quiet = 空 与 quiet=quiet_ 的区别 4 ...