「Luogu P5080 Tweetuzki 爱序列」
题目大意
给出一些数,需要求出 \(\frac{a_{i+1}}{3}=a_i\) 或 \(a_{i+1}=2 \times a_i\) 时最长的序列 \(a\).
分析
可以发现符合条件的序列 \(a\) 中不会出现重复的数字,而且对于一个数它的下一个位置最多只有两种情况,于是问题就变成了无环有向图最长链,这样就可以想到记忆化搜索,\(f_i\) 表示 \(i\) 为起点时的最长链长度,为了记录下路径,所以还需要用一个 \(nxt_i\) 表示 \(i\) 的下一个位置时什么,最后直接输出就好了.
代码
#include<bits/stdc++.h>
#define REP(i,first,last) for(int i=first;i<=last;++i)
#define DOW(i,first,last) for(int i=first;i>=last;--i)
using namespace std;
const int MAXN=1e6+7;
int N;
struct Edge//链式前向星
{
int to,next;
}edge[MAXN*2];
int edge_head[MAXN];
int edge_cnt=0;
#define TO_POINT(now) for(int edge_i=edge_head[now];edge_i;edge_i=edge[edge_i].next)
#define TO edge[edge_i].to
void AddEdge(int f,int t)
{
edge[++edge_cnt].to=t;
edge[edge_cnt].next=edge_head[f];
edge_head[f]=edge_cnt;
}
bool visit[MAXN];
long long arr[MAXN];//原数组
long long a[MAXN];//去重以后的数组
int f[MAXN];//记录每个位置的最长链长度
int Find(long long num)//二分查找是否存在这个数
{
int left=1,right=N,middle;
while(left<=right)
{
middle=(left+right)>>1;
if(a[middle]>=num)
{
right=middle-1;
if(a[middle]==num)
{
return middle;
}
}
else
{
left=middle+1;
}
}
return 0;
}
int nxt[MAXN];//记录下一个位置
void DFS(int now)//DFS
{
if(f[now])//如果搜索过就不需要搜索了
{
return;
}
f[now]=1;//开始的长度为1
TO_POINT(now)
{
DFS(TO);
if(f[TO]+1>f[now])//找到在自己连出的边中的最长链长度
{
f[now]=f[TO]+1;
nxt[now]=TO;//记录下一个位置
}
}
}
int main()
{
scanf("%d",&N);
REP(i,1,N)
{
scanf("%lld",&arr[i]);
}
sort(arr+1,arr+1+N);
arr[0]=arr[1]-1;
int cnt=0;
REP(i,1,N)//去重
{
if(arr[i]!=arr[i-1])
{
a[++cnt]=arr[i];
}
}
N=cnt;
int l;
REP(i,1,N)//对于每一个点连边
{
if(a[i]%3==0)//需要判断整除
{
l=Find(a[i]/3);
if(l)
{
AddEdge(i,l);
}
}
l=Find(a[i]*2);
if(l)
{
AddEdge(i,l);
}
}
int answer=0,st;
REP(i,1,N)//如果没有访问过就DFS这个位置
{
if(!f[i])
{
DFS(i);
}
if(f[i]>answer)//记录下最长链的开头
{
answer=f[i];
st=i;
}
}
printf("%d\n",answer);//输出答案
int now=st;
while(now)
{
printf("%lld ",a[now]);
now=nxt[now];
}
return 0;
}
「Luogu P5080 Tweetuzki 爱序列」的更多相关文章
- 【DP】【P5080】 Tweetuzki 爱序列
Description Tweetuzki 有一个长度为 \(n\) 的序列 \(a_1~,~a_2~,~\dots~,a_n\). 他希望找出一个最大的 \(k\),满足在原序列中存在一些数 \(b ...
- 「Luogu P1975 [国家集训队]排队」
题目大意 给出一个序列 \(h\),支持交换其中的两数,求出每一时刻的逆序对个数. 分析 求逆序对是 \(O(N\log_2N)\) 的,有 \(M\) 个操作,如果暴力求的话时间复杂度就是 \(O( ...
- 「Luogu P5368 [PKUSC2018]真实排名」
PKUSC签到题 题目大意 给出一个长度为 \(N\) 的序列,序列中有 \(K\) 个数会乘二,对于每个数计算在乘二后大于等于这个数的个数与乘二前没有发生变化的方案数. 分析 思路很清晰,可以将答案 ...
- 「Luogu P2824 [HEOI2016/TJOI2016]排序」
一道十分神奇的线段树题,做法十分的有趣. 前置芝士 线段树:一个十分基础的数据结构,在这道题中起了至关重要的作用. 一种基于01串的神奇的二分思想:在模拟赛中出现了这道题,可以先去做一下,这样可能有助 ...
- 「Luogu P3168 [CQOI2015]任务查询系统」
介绍本题的两种做法: 方法1 前置芝士 线段树:一个很重要的数据结构. 树状数组:一个很重要的数据结构. 具体实现 区间修改,单点查询很容易就会想到树状数组了,至于查询前k个数的和又可以丢给权值线段树 ...
- 「Luogu P3072 [USACO13FEB]周长Perimeter」
USACO的题目,感觉还是挺神奇的. 前置芝士 DFS(BFS)遍历:用来搜索(因为DFS好写,本文以DFS为准还不是因为作者懒) STL中的set(map)的基本用法:数据很大,不能直接存. 具体做 ...
- [Luogu 1963] NOI2009 变换序列
[Luogu 1963] NOI2009 变换序列 先%Dalao's Blog 什么?二分图匹配?这个确定可以建图? 「没有建不成图的图论题,只有你想不出的建模方法.」 建图相当玄学,不过理解大约也 ...
- 「About Blockchain(一)」达沃斯年会上的区块链
「About Blockchain(一)」 --达沃斯年会上的区块链 写在前面:1月23日到26日,在瑞士达沃斯召开了第48届世界经济论坛.这个新闻本没有引起我格外的关注,直到前两天张老师分享给我一篇 ...
- LOJ#10117. 「一本通 4.1 练习 2」简单题
LOJ#10117. 「一本通 4.1 练习 2」简单题 题目描述 题目来源:$CQOI 2006$ 有一个$n$个元素的数组,每个元素初始均为$0$.有$m$条指令,要么让其中一段连续序列数字反转— ...
随机推荐
- threading 官方 线程对象和锁对象以及条件对象condition
官方地址:https://docs.python.org/2/library/threading.html#thread-objects 以下只截取condition部分,其他Lock()以及thre ...
- Docker 基本命令和使用
Docker 基本命令 systemctl start docker : 启动 Docker systemctl stop docker : 停止 Docker systemctl restart d ...
- Opencv模块
参考博客:https://blog.csdn.net/u012679707/article/details/79505279
- 排序:ORDER BY
1.按照字段值进行排序: 语法:order by 字段 升序|降序 (asc|desc) 默认情况下为“升序” asc.asc=ascending 升 desc=descending 降 2.允许多字 ...
- 洛谷 P2058 海港(模拟)
题目链接:https://www.luogu.com.cn/problem/P2058 这是一道用手写队列模拟的一道题,没有什么细节,只是注意因为数不会很大,所以直接用数作为数组下标即可,不用用map ...
- P&R 7
Floorplan: 要做好floorplan需要掌握哪些知识跟技能? 通常,遇到floorplan问题,大致的debug步骤跟方法有哪些? 如何衡量floorplan的QA? [哥简单点说]:flo ...
- 用python实现文件加密功能
生活中,有时候我们需要对一些重要的文件进行加密,Python 提供了诸如 hashlib,base64 等便于使用的加密库. 但对于日常学习而言,我们可以借助异或操作,实现一个简单的文件加密程序,从而 ...
- u盘乱码了,如何备份
文/亡命之徒 2013年7月的最后一天,今天在公司下了些嵌入式的教程存在u盘里,准备拿回家到自己的本子上学习,不知怎的查到电脑上,显示一些文件夹,名字都是乱码,顿时心情扫地,无奈只能到互联网上寻找re ...
- caffe 模型的加载
在caffe中模型的加载是通过这个函数加载的: void Net<Dtype>::CopyTrainedLayersFrom(const string trained_filename)
- Codeforces Round #622 (Div. 2) A. Fast Food Restaurant
Tired of boring office work, Denis decided to open a fast food restaurant. On the first day he made ...