博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
OO’s Sequence
阅读量:4659 次
发布时间:2019-06-09

本文共 638 字,大约阅读时间需要 2 分钟。

题目数据范围$n\le 10^5$,$O(n^2)$的暴力必定超时。但是,$0<a[i] \le 10000$,可以先求出1~10000每个数的因子(vector)。

接下来,运用一个思想:

前不见古人,后不见来者。

即:对于每个位置i,找到左边最近的“古人”j,记为l[i],满足a[j]是a[i]的因子;找到右边最近的“来者”k,记为r[i],满足a[k]是a[i]的因子,就有$(i-j)\cdot (k-i)$个区间的f值可以加一。

为了$O(n\sqrt{\max(a[i])})$的实现,需要一个pos数组,记录每个数字最近的出现位置。对于每个位置i,遍历a[i]的因子,寻找最接近i的因子出现的位置(左侧找最大,右侧找最小)。pos用之前要初始化(左侧设为0,算时先将l[i]设为0;右侧设为$\le n+1$的值,算时先将r[i]设为n+1),保证因子在左侧/右侧。

注意:vector有两种等价的遍历方法,不可以混(以下摘自李煜东《算法竞赛进阶指南》)。

定义:

vector
a;

 

第一种:

for(int i=0;i
下标

 

第二种:

for(vector
::itetator it=a.begin();it!=a.end();it++) cout<<*it<
迭代器

 

转载于:https://www.cnblogs.com/xzs123456/p/10802938.html

你可能感兴趣的文章
java基础之 创建对象的几种方式
查看>>
[HNOI2008]明明的烦恼
查看>>
Navicat不能连接linux数据库问题
查看>>
centos7关闭防火墙
查看>>
《C#高级编程》 读书笔记 -索引
查看>>
session cookie原理及应用
查看>>
ID3算法详解
查看>>
BZOJ1925: [Sdoi2010]地精部落
查看>>
学习进度条第十一周
查看>>
linux常用命令
查看>>
设置SQL PLUS环境
查看>>
关于虚拟机VM
查看>>
eclipse、tomca和jvm的相关内存配置
查看>>
python的迭代器
查看>>
spy memcached spring demo
查看>>
Python基础语法
查看>>
4.1.1 硬币游戏
查看>>
获取服务器信息
查看>>
JavaScript_5_对象
查看>>
DataGrip导出查询结果数据
查看>>