【NOIP练习赛】T3、学习

Description

巨弱小 D 准备学习,有 n 份学习资料给他看,每份学习资料的 内容可以用一个正整数 ai 表示。小 D 如果在一天内学习了多份资料, 他只能记住这些资料的内容表示成的整数的最大公约数的部分。学习 若干份资料得到的收益是小 D 记下的内容之和,也就是学习的资料 数乘上这些资料内容的最大公约数。小 D 今天准备挑一段连续的资 料来学习,请你告诉他最大的收益是多少。

Input

第一行一个正整数 n,表示资料数。 接下来 n 个正整数 ai,分别表示每份资料的内容。

对于 20%的数据,n<=100;

对于 40%的数据,n<=1000;

对于 70%的数据,n<=100000;

对于 100%的数据,n<=500000,ai<=${10^9}$

Output

输出一个整数,表示答案。

Sample Input

5 30 60 20 20 20

Sample Output

80

Solution

应某人要求,来写题解

这道题还是有点难度,毕竟一个区间gcd,一直没想到解法,听dalao讲解后豁然开朗

确实本题只需边读边处理,在读入每个数时计算该数与前面所有数的gcd,又由gcd的一个小公式gcd(a,b,c)=gcd(gcd(a,b),c)所以我们只要用这个数和前面记录下的gcd再求出gcd就可以做到求区间[1..i],[2..i],[3..i]...,[i-1,i]的gcd

但是如果gcd重复太多,显然会T掉,而由于gcd(a,b,c)=gcd(gcd(a,b),c),则gcd(a,b)<=gcd(a,b,c)所以区间[1..i],[2..i],[3..i]...,[i-1,i]是单调不增的,那么我们就可以将gcd相同的数字合并,记录最左边的数(因为i为右端点,该点越左,gcd*区间长度就会越大)

那么为什么这样不会T呢?

因为我们这样处理的话,记录下的gcd都为a[i]的因数,而a[i]的因数不会超过${\log _2}a[i]$  个,所以我们记录下的前面的gcd个数不会超过${\log _2}a[i]$   个,只要暴力求,然后每次合并,并且每次更新最优解即可

还是挂程序吧

 #include<cstdio>
#include<algorithm>
#define ll long long
using namespace std;
int n,d[],k,l[];
ll ans;
int gcd(int a,int b){return a%b== ? b:gcd(b,a%b);}
int main()
{
scanf("%d",&n);
scanf("%d",&d[]);
l[]=,k=,ans=d[];
for (int i=;i<=n;i++) {
int m;
scanf("%d",&m);
for (int j=;j<=k;j++) d[j]=gcd(d[j],m);
int po=;
for (int j=;j<=k;j++) if (d[po]!=d[j]) d[++po]=d[j],l[po]=l[j];
k=po;
if (d[k]!=m) d[++k]=m,l[k]=i;
for (int j=;j<=k;j++) ans=max(ans,(ll)d[j]*(i-l[j]+));
}
printf("%lld",ans);
return ;
}

【NOIP练习赛】学习的更多相关文章

  1. 【NOIP练习赛】开车

    [NOIP练习赛]T2.开车 Description 老司机小 Q 要在一个十字路口指挥车队开车,这个十字路口可 以描述为一个 n*n 的矩阵,其中第 2 行到第 n-1 行都各有一道横向车 道,第 ...

  2. NOIP练习赛题目6

    长途旅行 难度级别:A: 运行时间限制:3000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 JY 是一个爱旅游的探险家,也是一名强迫症患者.现在JY 想要在C ...

  3. NOIP练习赛题目5

    小象涂色 难度级别:C: 运行时间限制:1000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 小象喜欢为箱子涂色.小象现在有c种颜色,编号为0~c-1:还有n个箱 ...

  4. NOIP练习赛题目3

    魔兽争霸 难度级别:C: 运行时间限制:1000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 小x正在销魂地玩魔兽他正控制着死亡骑士和n个食尸鬼(编号1-n)去打 ...

  5. NOIP练习赛题目4

    肥得更高 难度级别:C: 运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 自2009年以来,A.B站的历史就已经步入了农业变革的黎明期.在两站的 ...

  6. NOIP练习赛题目2

    小K的农场 难度级别:C: 运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 小K在MC里面建立很多很多的农场,总共n个,以至于他自己都忘记了每个 ...

  7. NOIP练习赛题目1

    有些题目可能没做,如计算几何.恶心模拟. 高级打字机 难度级别:C: 运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 早苗入手了最新的高级打字机 ...

  8. POJ_2104_Kth_(主席树)

    描述 http://poj.org/problem?id=2104 给出一个n个数的数列,m次询问,每次询问求区间[l,r]中第k小的数,无修改操作. K-th Number Time Limit: ...

  9. OI知识点|NOIP考点|省选考点|教程与学习笔记合集

    点亮技能树行动-- 本篇blog按照分类将网上写的OI知识点归纳了一下,然后会附上蒟蒻我的学习笔记或者是我认为写的不错的专题博客qwqwqwq(好吧,其实已经咕咕咕了...) 基础算法 贪心 枚举 分 ...

随机推荐

  1. 以位为单位存储标志-共用体-union

    一.程序的结构如下: typedef union _KEYST     {         struct         {             uint8 Key1_Flag :1;//表示第0 ...

  2. BNUOJ 33895 D-City

    D-City Time Limit: 1000ms Memory Limit: 65535KB This problem will be judged on HDU. Original ID: 449 ...

  3. HDU 3308 (线段树区间合并)

    http://acm.hdu.edu.cn/showproblem.php?pid=3308 题意: 两个操作  : 1 修改 单点  a 处的值. 2 求出 区间[a,b]内的最长上升子序列. 做法 ...

  4. poj 1562 简单深搜

    //搜八个方向即可 #include<stdio.h> #include<string.h> #define N 200 char ma[N][N]; int n,m,vis[ ...

  5. 过河(codevs 1155)

    题目描述 Description 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥 ...

  6. [USACO5.3]校园网Network of Schools 缩点

    题目描述 一些学校连入一个电脑网络.那些学校已订立了协议:每个学校都会给其它的一些学校分发软件(称作“接受学校”).注意即使 B 在 A 学校的分发列表中, A 也不一定在 B 学校的列表中. 你要写 ...

  7. codevs2370 小机房的树

    题目描述 Description 小机房有棵焕狗种的树,树上有N个节点,节点标号为0到N-1,有两只虫子名叫飘狗和大吉狗,分居在两个不同的节点上.有一天,他们想爬到一个节点上去搞基,但是作为两只虫子, ...

  8. NOIP1999 邮票面值设计

    题目描述 Description 给定一个信封,最多只允许粘贴N张邮票,计算在给定K(N+K≤40)种邮票的情况下(假定所有的邮票数量都足够),如何设计邮票的面值,能得到最大值MAX,使在1-MAX之 ...

  9. leetcode算法学习----155. 最小栈(MinStack )

    下面题目是LeetCode算法155题: https://leetcode.com/problems/min-stack/ 题目1:最小函数min()栈 设计一个支持 push,pop,top 操作, ...

  10. Hive之内置函数

    函数分类 UDF(User Defined Function):数据一对一 UDAF(User Defined Aggreation Function):数据多对一 UDTF(User Defined ...