description


analysis

  • 这题出的失败在只卡正解不卡暴力

  • 比较好想的方法是枚举约数,向两边二分,但是这个不满足二分性

  • 首先用\(ST\)表维护区间的\(\gcd\),不用线段树,这样查询就是\(O(\log_2(\max_{i=1}^{n} a_i))\)

  • 然后照上面的方法做就行了,枚举约数,向左右二分,判断区间\(\gcd\)是否等于当前约数

  • 时间复杂度\(O(n\log_2n)\)乘\(32\)的常数,注意卡常比如预处理出\(\log\)的值


code

#pragma GCC optimize("O3")
#pragma G++ optimize("O3")
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define MAXN 500005
#define ll long long
#define reg register ll
#define fo(i,a,b) for (reg i=a;i<=b;++i)
#define fd(i,a,b) for (reg i=a;i>=b;--i) using namespace std; ll f[MAXN][20],g[MAXN];
ll a[MAXN],ans[MAXN],LOG[MAXN];
ll n,mx,tot,cnt; inline ll read()
{
ll x=0,f=1;char ch=getchar();
while (ch<'0' || '9'<ch){if (ch=='-')f=-1;ch=getchar();}
while ('0'<=ch && ch<='9')x=x*10+ch-'0',ch=getchar();
return x*f;
}
inline ll gcd(ll x,ll y){return y?gcd(y,x%y):x;}
inline ll query_gcd(ll l,ll r)
{
ll k=LOG[r-l+1];
return gcd(f[l][k],f[r+1-(1<<k)][k]);
}
int main()
{
freopen("T2.in","r",stdin);
//freopen("point.in","r",stdin);
//freopen("point.out","w",stdout);
n=read(),LOG[0]=-1;
fo(i,1,n)a[i]=f[i][0]=read(),LOG[i]=LOG[i>>1]+1;
fo(j,1,LOG[n])fo(i,1,n+1-(1<<j))
f[i][j]=gcd(f[i][j-1],f[i+(1<<(j-1))][j-1]);
fo(i,1,n)
{
ll l=1,r=i,mid,tmp;
while (l<=r)
{
mid=(l+r)>>1;
query_gcd(mid,i)==a[i]?r=mid-1:l=mid+1;
}
tmp=l,l=i,r=n;
while (l<=r)
{
mid=(l+r)>>1;
query_gcd(i,mid)==a[i]?l=mid+1:r=mid-1;
}
if (r-tmp>mx){mx=r-tmp,ans[tot=1]=tmp;}
else if (r-tmp==mx)ans[++tot]=tmp;
}
sort(ans+1,ans+tot+1);ll i=1;
while (i<=tot)
{
g[++cnt]=ans[i];
while (ans[i]==ans[i+1] && i<=n)++i;
++i;
}
printf("%lld %lld\n",cnt,mx);
fo(i,1,cnt)printf("%lld ",g[i]);
return 0;
}

最新文章

  1. freemarker 数据做加减计算
  2. next([expr]) 取得一个包含匹配的元素集合中每一个元素紧邻的后面同辈元素的元素集合。
  3. SQL Server认证培训与考试
  4. express-3 最佳实践
  5. $.ajax()方法详解及实例
  6. 【Aizu 2305】Beautiful Currency
  7. JS 随机数
  8. shell中的双括号表达式
  9. linux crontab定时执行shell脚本
  10. Spark里面:获取图Spark有多少行代码
  11. gradle入门(1-1)gradle的概念和使用
  12. 数据cube的schema与sql的对应的关系
  13. 前端 聊聊Ajax
  14. vue build错误异常的解决方法
  15. Fio测试工具参数
  16. Mybatis项目中不使用代理写法【我】
  17. 在win10开启HyperV(Pro以上版本)安装的Docker,如何远程管理其他机器(Linux或者Win)的docker容器
  18. autoconf配置的项目,编译debug版本
  19. 菜鸟调错(二)——EJB3.0部署消息驱动Bean抛javax.naming.NameNotFoundException异常
  20. Linux定时任务Crontab命令详解_转

热门文章

  1. ArrayList底层代码解析笔记
  2. String,StringBuffer,StringBuilder
  3. Flatty Shadow图标自动产生器——在线生成各种扁平化 ICON
  4. 快速读取 C++
  5. 关于vsphere exsi安装时遇到的问题
  6. MyBatis中大于和小于号的转义写法
  7. 谷歌浏览器控制台出现 Unchecked runtime.lastError: The message port closed before a response was received. 的报错
  8. Java ArrayList使用技巧 - 两个ArrayList去除重复的元素
  9. AnalyticDB for PostgreSQL 6.0 新特性介绍
  10. thinkphp Widget扩展