首页 > 其他分享 >序列题解

序列题解

时间:2024-10-25 15:11:38浏览次数:5  
标签:cnt int 题解 100100 vis 序列 转移 dp

哈哈哈我也有个唐氏做法

也是考虑一个朴素 dp ,设 \(dp_{i}\) 表示以 \(i\) 结尾的字串最长是多少,则容易想到若 \(a_{i-1}\) 和 \(a_i\) 是等比数列的一部分就一定能从 \(dp_{i-1}\) 转移到 \(dp_i\),证明最后讲

那么如何判断 \(a_{i-1}\) 和 \(a_i\) 是否为等比数列的一部分呢?

首先设 \(d=max(a_i,a_{i-1}),x=min(a_i,a_{i-1}),c=d/x\)

变量名记忆方法

其实就是大,小,除的拼音首字母啦qwq

  1. 那么首先发现,如果 \(d\%x≠0\) 那就明显不是等比数列的一部分
  2. 接着考虑 \(d==x\) 的情况,发现若\(dp_{i-1}\) 是通过相同转移的则 \(dp_{i}=dp_{i-1}+1\),否则 \(dp_{i}=dp_2\)
    但是这就很尬了呀,我咋知道 \(dp{i-1}\) 是从那里转移的呢?
    没有关系,直接新开一个数组 \(f_i\) 表示 \(dp_i\) 是从哪里转移的(这个数组是一个伏笔)
  3. 最后就是正常情况了,很容易发现若 \(c\) 能拆解成 \(a^b\) ,那么就能转移成功……吗?
    发现必须和 \(dp_{i-1}\) 转移来源的 \(a\) 相同,所以fw回收再立用一下,使用 \(f\) 数组来存 \(a\)

最后的细节:和dyc一样离散化来去重

#include<bits/stdc++.h>
#define int long long
using namespace std;
int a[100100],n,dp[100100],inv[100100],tot=0,b[100100],lyh[100100],yz[170],f[100100],vis[100100],cnt=1;
int qpow(int x,int y){
	int aaa=1;
	while(y){
		if(y&1){
			aaa*=x;
		}
		x*=x;
		y>>=1;
	}
	return aaa;
}
signed main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		b[i]=a[i];
	}
	sort(b+1,b+1+n);
	int tt=unique(b+1,b+1+n)-b-1;
	for(int i=1;i<=n;i++){
		lyh[i]=lower_bound(b+1,b+1+tt,a[i])-b;
	}
	//↑离散化 
	inv[++tot]=2;
	for(int i=3;i<=1000;i++){
		for(int j=2;j<i;j++){
			if(i%j==0){
				break;
			}
			if(j==i-1){
				inv[++tot]=i;
			}
		}
	}
	//↑预处理1000以内的质数 
	dp[1]=1;
	vis[lyh[1]]=1;
	//vis[i]代表 i 是否用过 
	for(int i=2;i<=n;i++){
		int bbh=1;
		dp[i]=1;
		int x=min(a[i],a[i-1]),d=max(a[i],a[i-1]);
		if(d%x){
			cnt++;
			//cnt表示版本号 
			vis[lyh[i]]=cnt;
			continue;
		}
		if(d==x){
			if(!f[i-1]){
				dp[i]=dp[i-1]+1;
			}
			else{
				dp[i]=2;
				cnt++;
				vis[lyh[i]]=cnt;
			}
			continue;
		} 
		int c=d/x,t=0,tflag=0;
		for(int j=1;j<=tot;j++){
			yz[j]=0;
		}
		int maxn=0;
		for(int j=1;j<=tot;j++){
			while(c%inv[j]==0){
				yz[j]++;
				c/=inv[j];
			}
			maxn=max(maxn,yz[j]);
		}
		//↑分解质因数 
		if(c!=1){
			cnt++;
			vis[lyh[i]]=cnt;
			continue;
		}
		for(int k=1;k<=maxn;k++){
			int flag=1,sum=1;
			for(int j=1;j<=tot;j++){
				if(yz[j]%k){
					flag=0;
					break;
				}
				sum*=qpow(inv[j],yz[j]/k);
				if(sum>1000){
					flag=0;
					break;
				}
			}
			if(flag){
				tflag=1;
				f[i]=sum;
				if((sum==f[i-1]||!f[i-1])&&vis[lyh[i]]!=cnt){
					dp[i]=dp[i-1]+1;
					vis[lyh[i]]=cnt;
				}
				//↑成功转移 
			}
		}
		if(tflag){
			if(dp[i]<2){
				dp[i]=2;
				cnt++;
				vis[lyh[i]]=cnt;
			}
		}
		else{
			cnt++;
			vis[lyh[i]]=cnt;
		}
	}
	int ans=0;
	for(int i=1;i<=n;i++){
		ans=max(ans,dp[i]);
	}
	cout<<ans<<endl;
	return 0;
}

标签:cnt,int,题解,100100,vis,序列,转移,dp
From: https://www.cnblogs.com/lewisak/p/18502588

相关文章

  • 最长的Y题解
    考虑将Y单独拎出来,用数组存储他的下标,那么将第\(x\)个Y转移至第\(y\)个Y就需要\(a[x]-b[y]-1\)次操作。发现一个问题:第一次从左移动至\(y\)需要减1,第二次从左移动需要减2……如图:这似乎是一个很麻烦的问题,我们的某知名\(lyh\)教授是通过指针(应该是吧)解决的。......
  • 家谱树题解
    (ACM比赛时忘了拓扑怎么写时代尻古)假设有一个DAG图,那么如何写出它的拓扑排序呢?这里说一种比较常用的方法:1.从DAG图中选择一个没有前驱(即入度为0)的顶点并输出。2.从图中删除该顶点和所有以它为起点的有向边。3.重复1和2直到当前的DAG图为空或当前图中不存在无前驱的......
  • SSL证书常见问题解答
    在当今的数字时代,确保网站和数据的安全性变得尤为重要。SSL(SecureSocketsLayer)证书作为保障网站安全的关键组件,广泛应用于各种在线服务中。然而,在SSL证书的申请、安装和使用过程中,用户常常会遇到各种问题。本文旨在提供一个全面的指南,帮助用户理解并解决SSL证书的常见问题。......
  • 题解:CF722D Generating Sets
    涉及知识点:set。解题思路每次让列表中最大的元素缩小两倍,保证答案最优。如果当前的元素缩小成$0$就直接跳出循环,输出这个序列。由于序列需要支持插入、删除以及找最大值,所以这个序列可以用set来维护。代码#include<bits/stdc++.h>#defineintlonglong#definell......
  • 题解:P10298 [CCC 2024 S4] Painting Roads
    涉及知识点:图的遍历。我们观察样例可以发现,染色之后的图是一颗树,而且还是dfs树。题目要求所以路径上的颜色都是交替的,所以直接交替染色即可。注意:建图的时候需要记录当前边的编号。代码#include<bits/stdc++.h>#defineintlonglong#definell__int128#definedbd......
  • 题解:SP25334 NPC2015A - Eefun Guessing Words
    涉及知识点:字符串处理。解题思路记录每个字符出现的第$1$个位置和最后$1$个位置,询问时比较大小即可。代码#include<bits/stdc++.h>//#defineintlonglong#definell__int128#definedbdouble#defineldblongdouble#definevovoid#defineendl'\n'#defin......
  • 题解:CF1988B Make Majority
    题目大意题面写得很清楚,我就不再赘述了。解题思路涉及知识点:字符串,构造。由于所有相邻的$0$合并完会变成一个$0$,所以先贪心地把所有挨在一起的$0$合并起来,放在一个新的字符串里。而且题目需要你判断是否最终是否能合并成一个$1$,所以$1$是不需要想$0$一样合并的,这......
  • 题解:CF1994B Fun Game
    涉及知识点:异或,字符串处理。解题思路‌异或是一种二进制运算,用于比较两个数字的差异。当两个输入不同时,异或运算的结果为1;当两个输入相同时,结果为0。现在就可以切掉本题了。设两个字符串分别为$a$,$b$。如果$a$和$b$完全相同,输出Yes。如果$a$中没有$1$且$b$......
  • 题解:CF633D Fibonacci-ish
    涉及知识点:枚举,STL。题目大意给你一个序列,让你选出一些元素,使其构成fibonacccccci数列,求数列的最大长度。解题思路定义一个桶,$mp_i$代表$i$这个数在输入序列当中出现的次数。由于$n\le1000$,所以可以直接暴力枚举fibonacccccci数列的前两个数。前两个数固定了,这......
  • vue 项目history模式刷新404问题解决办法
    前言vue项目history模式部署到服务器后,根路径访问没有问题,但是进入其他功能再刷新页面就会出现404,因为你没在nginx或者apache配置上面加上重定向跳转。解决办法,只需要加上这段配置:nginx配置内容:location/{try_files$uri$uri/@router;indexindex.html;}lo......