小睿睿的数列-题解
小睿睿的数列
https://ac.nowcoder.com/acm/contest/6944/A
题目描述
小睿睿给了你一个长度为n的数列,他想问你该数列中满足条件(区间内存在某个数是区间内所有数的公因数)的最长区间有多少个
思路:假设当前这个数为公因数,然后向前向后搜,搜过的点不可能存在更长的符合条件的区间了就不用搜了,所以复杂度不高。
代码:
#include <iostream> #include <bits/stdc++.h> using namespace std; int a[2000005]; int vis[2000005]; int len[2000005]; int main() { int n; scanf("%d",&n); for(int i=0;i<n;i++)scanf("%d",&a[i]); for(int i=0;i<n;i++){ if(vis[i])continue; int j=i-1,cnt=1; while(j>=0){ if(a[j]>=a[i]&&(a[j]%a[i]==0||a[j]==a[i])) j--,cnt++; else break; } j=i+1; while(j<n){ if(a[j]>=a[i]&&(a[j]%a[i]==0||a[j]==a[i])) cnt++,vis[j]=1,j++; else break; } len[cnt]++; //printf("%d %d \n",i,cnt); } for(int i=n;i>=0;i--){ if(len[i]){ printf("%d\n",len[i]); break; } } return 0; }