题目描述

\(EZ\) 每周一都要举行升旗仪式,国旗班会站成一整列整齐地向前行进。

郭神摄像师想要选取其中一段照下来。他想让这一段中每个人的身高成等比数列,展示出最萌身高差。但他发现这个太难办到了。于是他决定放低要求,让等比数列的每两项之间可以是不连续的(例如:\(2\), \(4\), \(16\), …)。可他依然找不到满意的,便再次妥协,使这个等比数列可以是乱序的。

现在请你在其中找出最长的符合要求的一段,使得将这一段排序后为某个公比为 \(q\) 的等比数列的子序列\((q∈N*, q ≤ 1000)\)。

输入格式

第一行一个正整数\(N\),表示有 \(n\)个人。

接下来 \(n\)行每行一个正整数\(a_1,a_2,...a_n,\) 依次表示\(n\)个人的身高。

输出格式

一行一个整数 \(ans\),表示最长的符合要求的连续一段

样例

样例输入 1

7

2

4

6

6

1

36

3

样例输出 1

3

样例输入 2

10

1

2

3

4

5

6

7

8

9

10

样例输出 2

2

数据范围与提示

对于 \(20\%\)的数据,\(n \leq 100\)

对于 \(40\%\)的数据,\(n \leq 1000\)

对于另外 \(20\%\) 的数据,\(a_i \leq 100\)

对于 \(100\%\)的数据, \(n \leq 10^5,a_i \leq 10^{18}\)

分析

对于一个序列来说,如果它在排序之后能够形成一个等比数列

那么必须要满足序列中任意两数作除法得到的商是最小公比的整数次幂

我们要考虑的就是如何求出最小公比

因为公比最多为 \(1000\),所以我们可以把 \(2\) 到 \(1000\) 的整数次幂扔到一个哈希表里

每次在哈希表里查询当前数对应的值是多少

注意要特判公比为 \(1\) 的情况

代码

#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<set>
#define rg register
typedef long long ll;
inline ll read(){
rg ll x=0,fh=1;
rg char ch=getchar();
while(ch<'0' || ch>'9'){
if(ch=='-') fh=-1;
ch=getchar();
}
while(ch>='0' && ch<='9'){
x=(x<<1LL)+(x<<3LL)+(ch^48LL);
ch=getchar();
}
return x*fh;
}
const int maxn=1e5+5;
const int mod=1e5+3;
const ll INF=1000000000000000000LL;
ll a[maxn],mmax,mmin;
int ans=1,h[maxn],tot=1,n;
struct hash{
int num,nxt;
ll val;
}b[maxn<<4];
inline void ad(int num,ll val){
rg int now=1LL*val%mod;
for(rg int i=h[now];i!=-1;i=b[i].nxt){
if(b[i].val==val) return;
}
b[tot].val=val;
b[tot].num=num;
b[tot].nxt=h[now];
h[now]=tot++;
}
inline int cx(ll val){
rg int now=1LL*val%mod;
for(rg int i=h[now];i!=-1;i=b[i].nxt){
if(b[i].val==val) return b[i].num;
}
return 233;
}
std::set<ll> s;
int main(){
memset(h,-1,sizeof(h));
n=read();
ll lat=0;
int cnt=0;
for(rg int i=1;i<=n;i++){
a[i]=read();
if(a[i]==lat){
cnt++;
} else {
lat=a[i];
cnt=1;
}
ans=std::max(ans,cnt);
}
for(rg int i=2;i<=1000;i++){
lat=INF/i;
for(rg ll j=i;j<=lat;j*=i){
ad(i,j);
}
}
for(rg int l=1;l<n;l++){
s.clear();
s.insert(a[l]);
mmax=std::max(a[l],a[l+1]);
mmin=std::min(a[l],a[l+1]);
if(mmin==mmax || mmax%mmin) continue;
s.insert(a[l+1]);
rg int gys=cx(mmax/mmin);
ans=std::max(ans,2);
for(rg int r=l+2;r<=n;r++){
if(s.find(a[r])!=s.end()) break;
s.insert(a[r]);
mmax=std::max(a[r],a[r-1]);
mmin=std::min(a[r],a[r-1]);
if(mmax%mmin) break;
if(cx(mmax/mmin)!=gys) break;
ans=std::max(ans,r-l+1);
}
}
printf("%d\n",ans);
return 0;
}

上午小测1 B.序列 哈希表+数学的更多相关文章

  1. 上午小测3 T1 括号序列 && luogu P5658 [CSP/S 2019 D1T2] 括号树 题解

    前 言: 一直很想写这道括号树..毕竟是在去年折磨了我4个小时的题.... 上午小测3 T1 括号序列 前言: 原来这题是个dp啊...这几天出了好几道dp,我都没看出来,我竟然折磨菜. 考试的时候先 ...

  2. 重复的DNA序列[哈希表] LeetCode.187

    所有 DNA 由一系列缩写为 A,C,G 和 T 的核苷酸组成,例如:"ACGAATTCCG".在研究 DNA 时,识别 DNA 中的重复序列有时会对研究非常有帮助. 编写一个函数 ...

  3. 上午小测1 T1 木板 题解

    前言: WTCL,居然折磨煎蛋的性质都忘记了,WTCL. 考场上想出来了正解,就差一点就能A掉,挺难受的. 要记住一个数n可能会有一个大于\(\sqrt{n}\)的质因子..我忘记把它加进去了.... ...

  4. libevent中evmap实现(哈希表)

    libevent中,需要将大量的监听事件event进行归类存放,比如一个文件描述符fd可能对应多个监听事件,对大量的事件event采用监听的所采用的数据结构是event_io_map,其实现通过哈希表 ...

  5. 源码:Java集合源码之:哈希表(二)

    要想知道一个元素是否在数组或链表中,只能从前向后挨个对比,无论是数组还是链表,其对数据的查询表现都比较无力.在的二叉排序树中,还会将数据排序以进行二分查找,将时间复杂度从O(n)降低到O(lg n). ...

  6. 小测几种python web server的性能

    http://blog.csdn.net/raptor/article/details/8038476 因为换了nginx就不再使用mod_wsgi来跑web.py应用了,现在用的是gevent-ws ...

  7. [福大软工] Z班 团队作业——随堂小测(同学录) 作业成绩

    团队作业--随堂小测(同学录) 作业链接 http://www.cnblogs.com/easteast/p/7763645.html 作业情况 本次作业从原先预计的3小时,有些组打了鸡血连续肝了4. ...

  8. 福州大学软件工程1816 | W班 第8次作业[团队作业,随堂小测——校友录]

    作业链接 团队作业,随堂小测--校友录 评分细则 本次个人项目分数由两部分组成(博客分满分40分+程序得分满分60分) 博客和程序得分表 评分统计图 千帆竞发图 总结 旅法师:实现了更新,导出,查询, ...

  9. MySQL课堂小测

    目录 一.基本知识与操作方法 二.小测具体内容 (一)向数据库表中添加记录 (二)下载并导入world.sql (三)数据库查询与输出 (四)查询数据库并求某字段和 (五)查询数据库并取最大& ...

随机推荐

  1. Android开发中导入第三方库所遇问题记录

    1.重复循环依赖的问题 (1)需求 如下图所示: 在Android 项目中,采用模块化开发,一个是主跑application--Mudule A,另外一个是library--Library B 1)M ...

  2. 基础篇:深入JMM内存模型解析volatile、synchronized的内存语义

    目录 1 java内存模型,JMM(JAVA Memory Model) 2 CPU高速缓存.MESI协议 3 指令重排序和内存屏障指令 4 happen-before原则 5 synchronize ...

  3. Python-进程-进程池-原理

    进程 资源集合,调度和分配资源,说到进程就不得不提到线程,线程和进程是密不可分,进程申请了资源,但真正使用资源的是线程,其实本质上类似面向对象的思想,面向对象把数据和数据的操作封装在一个类中,进程把资 ...

  4. 中秋国庆8天挑战赛 之 挑战8天掌握微信小程序

    中秋国庆8天挑战赛 挑战8天掌握微信小程序 当前学习进度: // 10.1​// 学习内容:​// 10.2​// 学习内容:​// 10.3​// 学习内容:​// 10.4​// 学习内容:​// ...

  5. Tomcat 第五篇:请求处理流程(下)

    1. 请求处理流程 AprEndPoint 顺着上一篇接着聊,当一个请求发送到 Tomcat 以后,会由连接器 Connector 转送至 AprEndPoint ,在 AprEndPoint 中调用 ...

  6. Java知识系统回顾整理01基础03变量03字面值

    一.字面值定义 创建一个Hero对象会用到new关键字,但是给一个基本类型变量赋值却不是用new. 因为基本类型是Java语言里的一种内置的特殊数据类型,并不是某个类的对象.  给基本类型的变量赋值的 ...

  7. http协议和chrome浏览器

    http协议和Chrome抓包工具 什么是http和https协议: HTTP协议:全称是HyperText Transfer Protocol,中文意思是超文本传输协议,是一种发布和接收HTML页面 ...

  8. mac操作liunx

    mkdir demo //创建一个文件夹 touch index.html // 创建一个html文件 rm rouch index.html //删除找个index.html文件 rmdir dem ...

  9. 史上最全Python快速入门教程,满满都是干货

    Python是面向对象,高级语言,解释,动态和多用途编程语言.Python易于学习,而且功能强大,功能多样的脚本语言使其对应用程序开发具有吸引力.Python的语法和动态类型具有其解释性质,使其成为许 ...

  10. PHP的学习(提前学习了,业余爱好) (一)

    一个函数一个函数地堆 strstr()函数 在本地测试的时候,代码与显示如下 1.代码: <?php echo strstr("I love Shanghai!123",&q ...