取数游戏 game bzoj-1978 BeiJing-2010

题目大意:给定一个$n$个数的$a$序列,要求取出$k$个数。假设目前取出的数是$a_j$,那么下次取出的$a_k$必须保证:$j<k$且$gcd(a_j,a_k)/reL$。问最多能取出多少个数。

注释:$1\le n\le 5\cdot 10^4$,$2\le L \le a_i\le 10^6$。


想法

显然可以用动态规划解决。

状态:$dp_i$表示强制选第$i$个数,前$i$个数中最多能取多少个数。

转移是$O(n^2)$的。

接下来,我们思考:如何才能优化这个过程。

有一个性质:

假设存在$i<j<k$,使得$m|a_i,m|a_j,m|a_k,m\ge L$,那么我们选择用$j$更新$k$而不是$i$,原因在于$f_j$完全可以在$i$构成的序列中,后面加上$j$因为$gcd(a_i,a_j)\ge m\ge L$。

所以我们只需要更新出$lst$数组:$lst_i$表示枚举到当前的$a$,可以被$i$整除的最大的下标(时间戳)最大是多少。

接下来,我们既可以通过$lst$数组来更新$dp$数组。

具体地:每次我们枚举当前元素的时候,将当前元素质因数分解,动态更新$lst$数组。

如何更新$f$数组呢?

我们只需要将$lst$数组的值直接加到$f$上可。

总时间复杂度$O(n\sqrt n)$。

Code

#include <bits/stdc++.h>
#define N 50010
#define M 1000010
using namespace std;
int f[N],mx[M],a[N];
inline char nc() {static char *p1,*p2,buf[100000]; return (p1==p2)&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;}
int rd() {int x=0; char c=nc(); while(!isdigit(c)) c=nc(); while(isdigit(c)) x=(x<<3)+(x<<1)+(c^48),c=nc(); return x;}
int main()
{
int n=rd(),L=rd(); for(int i=1;i<=n;i++) a[i]=rd();
for(int i=1;i<=n;i++)
{
int now=0;
for(int j=1;j*j<=a[i];j++)
{
if(a[i]%j==0)
{
if(j>=L) now=max(now,mx[j]);
if(j*j!=a[i])
{
if(a[i]/j>=L) now=max(now,mx[a[i]/j]);
}
}
}
f[i]=now+1;
for(int j=1;j*j<=a[i];j++)
{
if(a[i]%j==0)
{
if(j>=L) mx[j]=max(mx[j],f[i]);
if(j*j!=a[i])
{
if(a[i]/j>=L) mx[a[i]/j]=max(mx[a[i]/j],f[i]);
}
}
}
}
int ans=0; for(int i=1;i<=n;i++) ans=max(ans,f[i]);
printf("%d\n",ans);
return 0;
}

小结:优化$dp$的好题。

最新文章

  1. Android ImageView图片透明区域不响应点击事件,不规则图片透明区域响应点击事件
  2. Java实现zip压缩多个文件下载
  3. zsh 通信脚本
  4. 查询SQL 对象及存储过程
  5. linux下tftp安装与设置
  6. Windows Server 2008R2配置MySQL Cluster并将管理节点和数据节点配置成windows服务
  7. Using the viewport meta tag to control layout on mobile browsers
  8. MyEclipse 10优化技巧
  9. Jquery方法大全
  10. iOS中MVVM的架构设计与团队协作
  11. 由一道bash jail题引出的琐事@_@
  12. MySQL的常用操作命令详解
  13. MySQL插入中文数据出现?号
  14. vue 快速入门、常用指令(1)
  15. 重置SQLSERVER表的自增列,让自增列重新计数
  16. 关于分布式uuid的一点设想
  17. MySQL中基于mysqldump和二进制日志log-bin进行逻辑备份以及基于时间点的还原
  18. 【Zookeeper】源码分析之请求处理链(四)之FinalRequestProcessor
  19. WebService与RESTful WebService
  20. ide vscode安装

热门文章

  1. poj1930 Dead Fraction
  2. Android基础夯实--重温动画(四)之属性动画 ValueAnimator详解
  3. java io性能分析
  4. SQLite busy handler
  5. [安卓开发板]迅为IMX6 四核Android开发板
  6. cksum - 一个文件的检查和以及字节数
  7. WPF学习- AllowDrop 用户控件启用拖放功能
  8. Discuz!代码
  9. 「 Luogu P3137 」X 「 USACO16FEB 」 圆形谷仓
  10. 反连接NOT EXISTS子查询中有or 谓词连接条件SQL优化一例