Hetao P1169 点集 题解 [ 黄 ][ 线性dp ]
题解
一道非常傻逼,非常傻逼的暴力题,一点都不优雅,这能放普及 T4 真是开了眼了。
本题难点主要就是在时间复杂度的计算上,只要算对了并且有勇气去打就能 AC 。
首先发现能形成一个点集,当且仅当所有点从小到大排序后,后面的点是前面所有点的倍数。
因此,我们只要保证点集中的数 \(b_i = k * b_{i-1}\) 即可。
于是,状态转移方程就这样推出来了。
\(b_i = max(k * b_{i-1}), (2\le k\le \frac{10^6}{b_{i-1}})\) , 枚举 \(k\) 与 \(b_{i-1}\) 即可。
注意要提前离散一下所有数,然后开个 map 或 数组 判断某个数是否存在。
几个重要的性质:
一个点集最多有 $log n $ 种数。
由于对于所有 \(b\) 枚举 \(k\) 的时间为 $ \frac{10^6}{1} + \frac{10^6}{2} + \frac{10^6}{3} + \text{...}$ $ + \frac{10^6}{1000000-1} + \frac{10^6}{1000000} $ ,即它是一个调和级数,时间为 $O(ln n) \approx O(log n) $,可以过。
同样可以理解为一个反比例函数,然后分段求下和也可以证明这个复杂度正确。
注意,状态转移要从小往大转移。
赛时早就想出做法但不敢写,在比赛最后 20min 的时候才A掉这题的我是个傻逼。
#include <bits/stdc++.h>
using namespace std;
int n,a;
vector<int> v;
struct num{
int val,t=0,dp=0;//t为其出现次数,dp为动态规划
};
vector<num> vct;
int m[1000005];
int main()
{
freopen("set.in","r",stdin);
freopen("set.out","w",stdout);
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a;
v.push_back(a);
}
//离散化
sort(v.begin(),v.end());
memset(m,-1,sizeof(m));
int tmp=0;
for(auto i:v)
{
if(tmp==0 || v[tmp-1]!=i)
{
vct.push_back({i,1});
m[i]=vct.size()-1;
}
else vct[vct.size()-1].t++;
tmp++;
}
//动态规划
int maxans=-1;
for(int i=0;i<vct.size();i++)
{
vct[i].dp=max(vct[i].dp,vct[i].t);
int x=vct[i].val,y=vct[i].t,z=vct[i].dp;
for(int j=2;j*x<=1000000;j++)
{
if(m[j*x]!=-1)
{
vct[m[j*x]].dp=max(vct[m[j*x]].dp,vct[m[j*x]].t+z);
}
}
maxans=max(maxans,vct[i].dp);
}
cout<<maxans;
return 0;
}
Hetao P1169 点集 题解 [ 黄 ][ 线性dp ]的更多相关文章
- 【AHOI2009】中国象棋 题解(线性DP+数学)
前言:这题主要是要会设状态,状态找对了问题迎刃而解. --------------------------- 题目描述 这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可 ...
- Codeforces 176B (线性DP+字符串)
题目链接: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=28214 题目大意:源串有如下变形:每次将串切为两半,位置颠倒形成 ...
- POJ 2479-Maximum sum(线性dp)
Maximum sum Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 33918 Accepted: 10504 Des ...
- 【洛谷P1854】花店橱窗 线性dp+路径输出
题目大意:给定 N 个数字,编号分别从 1 - N,M 个位置,N 个数字按照相对大小顺序放在 M 个位置里,每个数放在每个位置上有一个对答案的贡献值,求一种摆放方式使得贡献值最大. 题解:一道典型的 ...
- 线性dp
线性dp应该是dp中比较简单的一类,不过也有难的.(矩乘优化递推请出门右转) 线性dp一般是用前面的状态去推后面的,也有用后面往前面推的,这时候把循环顺序倒一倒就行了.如果有的题又要从前往后推又要从后 ...
- [CodeForces - 1272D] Remove One Element 【线性dp】
[CodeForces - 1272D] Remove One Element [线性dp] 标签:题解 codeforces题解 dp 线性dp 题目描述 Time limit 2000 ms Me ...
- 非常完整的线性DP及记忆化搜索讲义
基础概念 我们之前的课程当中接触了最基础的动态规划. 动态规划最重要的就是找到一个状态和状态转移方程. 除此之外,动态规划问题分析中还有一些重要性质,如:重叠子问题.最优子结构.无后效性等. 最优子结 ...
- P3387缩点(tarjan+拓扑排序+线性dp)
题目描述 给定一个 n个点 m 条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之和最大.你只需要求出这个权值和. 允许多次经过一条边或者一个点,但是,重复经过的点,权值只计算一次. 输入 ...
- 洛谷P1140 相似基因(线性DP)
题目背景 大家都知道,基因可以看作一个碱基对序列.它包含了444种核苷酸,简记作A,C,G,TA,C,G,TA,C,G,T.生物学家正致力于寻找人类基因的功能,以利用于诊断疾病和发明药物. 在一个人类 ...
- LightOJ1044 Palindrome Partitioning(区间DP+线性DP)
问题问的是最少可以把一个字符串分成几段,使每段都是回文串. 一开始想直接区间DP,dp[i][j]表示子串[i,j]的答案,不过字符串长度1000,100W个状态,一个状态从多个状态转移来的,转移的时 ...
随机推荐
- 2022GPLT
老板的作息表 检查任意一张时间表,找出其中没写出来的时间段. 输入第一行给出一个正整数 \(N\),为作息表上列出的时间段的个数.随后 \(N\) 行,每行给出一个时间段,格式为: hh:mm:ss ...
- 关于被static修饰还可序列化的问题
今天为了验证一下被static修饰的变量到底可不可以序列化,出现了以下的情况: 然后找到一条评论,豁然开朗 把序列化的内容注释掉,直接从序列化文件读取对象,就发现没有获取到
- 纯JS+CSS实现羊了个羊
前言 省流 gitee上扒的,感觉还不错,拿下来玩玩. https://gitee.com/kenxq/ylgy.git 技术说明 纯JS+CSS实现羊了个羊,包含部分特效,响应式手机.电脑.ipad ...
- 微软中文输入法带来的一点小坑,导致arcgispro输入中文异常
有同事反映,在Pro中新建要素类时,没办法设定名称为"新建",会自己变成不完整的拼音. 查看了一下,确有此事. 在相同的界面里还有其他输入框,却没有这种情况. 研究了一下,发现是输 ...
- ruoyi若依前端验证码不显示的终极解决方法-20230721
搞了3天啊,查了各种资料啊. 然后使劲的看log啊,总算搞定了啊. 一般情况,本地开发环境测试没问题,部署到服务器就各种不适应,就是服务器配置的问题了. 本次这种验证码不显示,典型的nginx的配置 ...
- JEP 457 Java 22:Class-File API
查看 Java 22:Class-File API | 作者:Ben Weidig | 2024 年 4 月 | Medium 终于有一个和 DLR 相当的官方库了.
- CompilerGenerated与GeneratedCode区别
前言 最近在捣鼓代码生成器,基于 Roslyn,我们可以让生成器项目生成我们的目标 C# 代码,这个也是MVVM Toolkit的实现方式,在查看生成代码的过程中,我们经常会遇到一些特殊的特性,如 G ...
- 对DenseTensor进行Transpose
ML.NET 是微软推出的为. NET 平台设计的深度学习库,通过这个东西(ModelBuilder)可以自己构建模型,并用于后来的推理与数据处理.虽然设计是很好的,但是由于现在的 AI 发展基本上都 ...
- RedisTemplate配置的jackson.ObjectMapper里的一个enableDefaultTyping方法过期解决
1.前言 最近升级SpringBoot,从2.1.6版本升级到2.2.6版本,发现enableDefaultTyping方法过期过期了. 该方法是指定序列化输入的类型,就是将数据库里的数据安装一定类型 ...
- Qt编写地图综合应用53-省市轮廓图下载
一.前言 Qt的浏览器控件的交互机制非常方便,所以在在线地图的时候可以对每个区域的经纬度坐标集合发给Qt程序,让他去存储到文件,在实际的测试过程中,发现有部分地图有多个封闭的曲线的,比如散落的岛屿和飞 ...

