小 Y 酷爱的接龙游戏正是这样。玩腻了成语接龙之后,小 Y 决定尝试无平方因子二元合数接龙,规则如下:

现有 \(n\) 个不超过 \(K\) 的合数,每个合数 \(a\) 均可表示为 \(a=pq(p \lt q)\)。

若 \(a=p_1q_1(p_1<q_1),b=p_2q_2(p_2<q_2)\),当且仅当 \(q_1=p_2\) 时 \(b\) 能接在 \(a\) 后面。

请问从给定的这 \(n\) 个数中选数接龙,最长可以形成一个包含多少数的接龙序列?

\(1 \le n \le 50000,1 \le K \le 10^6\)

签到题(可我却签了 \(1\) 个小时的到)

首先,我们可以用线性筛做到 \(O(K\log{K})\) 的时间复杂度内分解 \(2 \sim K\) 的所有满足 \(a=pq\) 的数以及它们的 \(p,q\)。

暴力的做法是我们排序,然后当遍历到了 \(i\),就查找所有 \(j\),使得 \(p_j=q_i\)。然后暴力统计。时间复杂度不会算。

然后发现查找 \(j\) 可以先查找第一个 \(j\) 然后二分做到 \(O(\log n)\)。

然后发现查找 \(j\) 可以预处理做到 \(O(1)\)。

如果你真这么写,也许只有 \(60\) 分。

最后我们发现,暴力时我们搜索了许多重复子问题,而重复子问题可以使用动态规划进行优化,这里直接写的是记忆化搜索。

然后就有了一个 \(100\) 分算法。

#include <bits/stdc++.h>
#define int unsigned long long
using namespace std; const int VSIZE = 1e6+5,N = 50005; bool vis[VSIZE];
int prime[VSIZE],tot;
int n;
pair<int,int> cj[VSIZE];
int first[VSIZE]; void sieve(){
for(int i=2;i<=1e6;i++){
if(!vis[i]){
prime[++tot]=i;
}
for(int j=1;j<=tot&&i*prime[j]<=1e6;j++){
vis[i*prime[j]]=1;
if(!(i%prime[j])){
break;
}
}
}
for(int i=1;i<=tot;i++){
for(int j=i;j<=tot&&prime[i]*prime[j]<=1e6;j++){
cj[prime[i]*prime[j]].first=(prime[i]);
cj[prime[i]*prime[j]].second=(prime[j]);
}
}
} pair<int,int> chai(int x){
return cj[x];
} pair<int,int> a[N];
int nowt;
vector<pair<int,int> > now;
bool visited[N];
int ans;
int f[N]; int dfs(int i){
visited[i]=1;
if(f[i]){
return f[i];
}
f[i]=1;
int second = a[i].second;
int l = first[second];
if(l>0){
for(int j=l;a[j].first==second;j++){
if(a[j].first!=second){
break;
}
f[i]=max(f[i],dfs(j)+1);
}
}
return f[i];
} signed main(){
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
sieve();
cin>>n;
memset(first,-1,sizeof(first));
for(int i=1;i<=n;i++){
int v;
cin>>v;
a[i]=chai(v);
if(a[i].first>a[i].second){
swap(a[i].first,a[i].second);
}
}
sort(a+1,a+n+1);
for(int i=1;i<=n;i++){
if(first[a[i].first]!=-1){
first[a[i].first]=min(first[a[i].first],i);
}
else{
first[a[i].first]=i;
}
}
for(int i=1;i<=n;i++){
if(!visited[i])
dfs(i);
}
cout<<*max_element(f+1,f+n+1)<<'\n';
return 0;
}

51NOD5213A 【提高组/高分-省选预科 第一场【M】】序列的更多相关文章

  1. 校省选赛第一场A题Cinema题解

    今天是学校省选的第一场比赛,0战绩收工,死死啃着A题来做,偏偏一直WA在TES1. 赛后,才发现,原来要freopen("input.txt","r",stdi ...

  2. 「CSP」第一届提高组考后总结

    「CSP」第一届提高组考后总结 问题分析+反思 成绩 心态 考前心态 考时心态 考后心态 方法 心灵鸡汤... 在学习了三年之后,我们信竞迎来了初中最后一次大考,也是第一次 CSPCSPCSP 考试. ...

  3. 【佛山市选2013】JZOJ2020年8月7日提高组T2 树环转换

    [佛山市选2013]JZOJ2020年8月7日提高组T2 树环转换 题目 描述 给定一棵N个节点的树,去掉这棵树的一条边需要消耗值1,为这个图的两个点加上一条边也需要消耗值1.树的节点编号从1开始.在 ...

  4. 计蒜客 NOIP 提高组模拟竞赛第一试 补记

    计蒜客 NOIP 提高组模拟竞赛第一试 补记 A. 广场车神 题目大意: 一个\(n\times m(n,m\le2000)\)的网格,初始时位于左下角的\((1,1)\)处,终点在右上角的\((n, ...

  5. 【佛山市选2013】JZOJ2020年8月7日提高组T3 海明距离

    [佛山市选2013]JZOJ2020年8月7日提高组T3 海明距离 题目 描述 对于二进制串a,b,他们之间的海明距离是指两个串异或之后串中1的个数.异或的规则为: 0 XOR 0 = 0 1 XOR ...

  6. 【佛山市选2013】JZOJ2020年8月7日提高组T1 回文子序列

    [佛山市选2013]JZOJ2020年8月7日提高组T1 回文子序列 题目 描述 回文序列是指左右对称的序列.例如1 2 3 2 1是回文序列,但是1 2 3 2 2就不是.我们会给定一个N×M的矩阵 ...

  7. 比赛总结——牛客网 NOIP赛前集训营提高组模拟第一场

    第一场打的很惨淡啊 t1二分+前缀最小值没想出来,20分的暴力也挂了,只有10分 t2数位dp,调了半天,结果因为忘了判0的特殊情况WA了一个点,亏死 t3emmmm.. 不会 imone说是DSU ...

  8. [NOIP2012] 提高组 洛谷P1081 开车旅行

    题目描述 小 A 和小 B 决定利用假期外出旅行,他们将想去的城市从 1 到 N 编号,且编号较小的 城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市 i 的海拔高度为 Hi,城市 ...

  9. NOIP2014提高组 酱油记

    NOIP考到哪里我就写到哪里好了. 2014/10/12 初赛 下午两点半开始考,我两点就到了.然后看到了QYL,NYZ,CZR等大神,先Orz了再说. 考试开始前,发现考场竟然没几个我认识的,不是按 ...

  10. NOIP2011提高组 聪明的质监员 -SilverN

    题目描述 小T 是一名质量监督员,最近负责检验一批矿产的质量.这批矿产共有 n 个矿石,从 1到n 逐一编号,每个矿石都有自己的重量 wi 以及价值vi .检验矿产的流程是: 1 .给定m 个区间[L ...

随机推荐

  1. 基于Camera Link和PCIe DMA的多通道视频采集和显示系统

    基于Camera Link和PCIe DMA的多通道视频采集和显示系统 在主机端PCIe驱动的控制和调度下,视频采集与显示系统可以同时完成对多个Camera Link接口视频采集以及Camera Li ...

  2. python中的if条件语句

    # 如果...就... # 1. print('1.') if 1+1 == 2: print('1+1是等于2的') print('1+1还是等于2的') print('1+1就等于2的') # 2 ...

  3. vue3 页面跳转

    需要引入 useRouter import {useRouter} from "vue-router"; 然后声明对象 代码如下 export default { setup() ...

  4. Python基础之函数:2、globlal与nonlocal和闭包函数、装饰器、语法糖

    目录 一.global与nonlocal 1.global 2.nonlocal 二.函数名的多种用法 三.闭包函数 1.什么是闭包函数 2.闭包函数需满足的条件 3.闭包函数的作用 4.闭包函数的实 ...

  5. java将秒数转换为时分秒格式

    /** * 转换时间格式为xx小时xx分xx秒 * @param second xxxxx */ public String changeTimeFormat(String second) { Int ...

  6. Linux 挂载Windows共享文件夹和NAS存储

    summary: [Linux 挂载共享存储] 概述 将Windows共享文件夹和NAS存储挂载至Linux. Linux系统环境:CentOS 挂载共享存储 查看外部主机共享了哪些目录 smbcli ...

  7. tomcat报Address localhost:1099 is already in use

    idea运行tomcat报Address localhost:1099 is already in use 解决方案: 电脑桌面->ctrl+shift+esc 打开任务管理器,选择详细信息,找 ...

  8. 使用Jupyter记事本记录和制作.NET可视化笔记

    前言:对于记录笔记的工具特别多,不过对于程序员来说,记录笔记+程序代码+运行结果演示可以同时存在,无疑会极大增加我们的笔记的可读性和体验感.以前在写python的时候,使用jupyter的体验很好,所 ...

  9. 云原生学习笔记-1-docker

    一.基础环境说明 1.操作系统:Centos7.6:1master:2node 2.docker版本:docker-ce 19.03.8-3 二.docker安装 1.使用阿里镜像仓库,mirror. ...

  10. 网络编程:软件开发架构、架构总结、网络编程前戏、OSI七层协议简介、OSI七层协议之物理连接层、数据链路层、网络相关专业名词、OSI七层协议之网络层

    目录 软件开发架构 架构总结 网络编程前戏 OSI七层协议简介 OSI七层协议之物理连接层 OSI七层协议之数据链路层 网络相关专业名词 OSI七层协议之网络层 OSI七层协议之传输层 软件开发架构 ...