小 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. JSP中实现留言页面的编写并将留言信息展示出来

    1.JavaBean类,实现java代码和html的部分分离,提高代码的复用 package com.wgh; public class MessageBean { private String au ...

  2. HTML+CSS基础知识(5)相对定位、绝对定位、固定定位

    文章目录 1.相对定位 1.1 代码 1.2 测试结果 2.绝对定位 2.1 代码 2.2 测试 3.固定定位 3.1 代码 3.2 测试结果 1.相对定位 1.1 代码 <!DOCTYPE h ...

  3. llinux下mysql建库、新建用户、用户授权、修改用户密码

    1.创建新的数据库 1.1.root用户登录mysql mysql -u root -p  1.2.查看现有数据库 show databases;  1.3.新建数据库,此命名为cjc create ...

  4. 关于引用JS和CSS文件刷新浏览器缓存问题,部署服务器后客户端样式不刷新

    问题描述 对样式的css文件进行了修改,部署到服务器后访问发现页面展示不正常,但是刷新之后就会展示正常. 问题分析 研究之后发现可能的原因有 css文件过大,加载缓慢 本地缓存问题,虽然服务器修改了c ...

  5. 空链接的作用以及<a href="#"></a>和<a href="javascript:;"></a>的区别

    空链接的作用以及<a href="#"></a>和<a href="javascript:;"></a>的区别在 ...

  6. 二十九、Helm常用命令

    # 创建一个chart范例 helm create HELM-NAME # 检查chart语法 helm lint ./HELM-NAME # 使用默认chart部署到k8s helm install ...

  7. HTTP(s) API 经验总结

    目录 参考文章 First URL HTTP(s)-Header 请求方式 参考文章 https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Overvie ...

  8. 2022春每日一题:Day 41

    题目:I Hate It 一个基础的线段树模板,单点修改+区间查询 代码: #include <cstdio> #include <cstdlib> #include < ...

  9. 2022春每日一题:Day 13

    题目:后缀排序 什么是后缀数组?他主要包含两个数组:sa和rk. 其中sa[i]表示将字符串后缀排序后第i小的编号,rk[i]表示后缀i的排名. 显然sa[rk[i]]=i,rk[sa[i]]=i. ...

  10. 操作系统课程设计pintos project1实验摘记

    第一部分 项目概述 一.Pintos简介 Pintos是一个基于80x86架构的简单操作系统框架,它支持内核级线程.能够加载和运行用户程序,也拥有文件系统,不过,这些功能均以一种简单的形式实现. 二. ...