「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$条指令,要么让其中一段连续序列数字反转— ... 
随机推荐
- poj 3281Dining(网络流 拆点)
			题目链接:http://poj.org/problem?id=3281 题目大意:John养了N只奶牛,他为奶牛准备了F个食物和D个饮料,但是每只奶牛只对其中的一些饮料和食物感兴趣,现在请制定一些方案 ... 
- hz和s和脉冲
			先弄清楚定义,HZ是频率的单位,而s是周期的单位:而f=1/T. 故1hz=1s:5hz=1/5=0.02s; 占空比 占空比(Duty Ratio)在电信领域中有如下含义: 在一串理想的 ... 
- Spring Boot框架 - 数据访问  - 整合Mybatis
			一.新建Spring Boot项目 注意:创建的时候勾选Mybatis依赖,pom文件如下 <dependency> <groupId>org.mybatis.spring.b ... 
- 2.4 【配置环境】TestNG安装
			两种方法可以安装TestNG Eclipse插件: (来源:http://blog.csdn.net/hongchangfirst/article/details/7679849/) 第一种,离线安 ... 
- 【游戏体验】Buttonhunt(鼠标寻找按钮)
			虽然画风千奇百变 但这款益智游戏的趣味性相当高 推荐试玩 个人测评 游戏性 9/10 音乐 4/10 剧情 6/10 总评 19/30 
- go基础_接口断言
			// interface package main import ( "fmt" ) //定义一个接口,接口名字Inter,接口的方法集有2个方法 type Inter inter ... 
- knn 算法 k个相近邻居
			# 一个最基本的例子 #样本数据的封装 feature = [[170,70,42],[166,56,39],[188,90,44],[165,88,40],[170,66,40],[176,80,4 ... 
- blog主题——田野(1)
			贮存一下,blog代码 QAQ 页首html <link rel='stylesheet' href='https://blog-static.cnblogs.com/files/elkyo/c ... 
- 发现一个比较好玩的,git的仓库可以转换
			我们通过 git clone 下载一个仓库到本地, 1.这个本地的文件夹名字可以随便改. 2.如果你把本地仓库的全部文件,剪切到另一个文件夹内,这个新的文件夹就是git的本地仓库. 
- md5模块(Python内置模块)和hashlib模块
			转自https://my.oschina.net/duhaizhang/blog/67214 MD5模块用于产生消息摘要,康用来判断文件是否相同. python的md5模块使用非常简单,包括以下几个函 ... 
