【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. PAT 1121 Damn Single

    "Damn Single (单身狗)" is the Chinese nickname for someone who is being single. You are suppo ...

  2. Ural 1036 Lucky Tickets

    Lucky Tickets Time Limit: 2000ms Memory Limit: 16384KB This problem will be judged on Ural. Original ...

  3. Leetcode 123.买卖股票的最佳时机III

    买卖股票的最佳时机III 给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你最多可以完成 两笔 交易. 注意: 你不能同时参与多笔交易(你 ...

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

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

  5. Mysql优化和执行计划

    SQL优化准则 禁用select * 使用select count(*) 统计行数 尽量少运算 尽量避免全表扫描,如果可以,在过滤列建立索引 尽量避免在where子句对字段进行null判断 尽量避免在 ...

  6. HDU——1133 Buy the Ticket

    Buy the Ticket Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) T ...

  7. - > 并查集详解(第二节)

    以下是并查集思路详解: 一:概念 并查集处理的是“集合"之间的关系.当给出两个元素的一个无序数对(a,b)时,需要快速“合并”a和b分别所在的集合,这期间需要反复“查找”某元素所在的集合.“ ...

  8. Vue插槽的另外一些特性

    之前有个项目,想判断一下,某一个模板内的插槽是否被使用. 不知道是不是问题过于简单,网上没有这方面的说明.我就抽时间验证一下vue插槽相关的一些功能. 然后写下这篇随笔,希望对后来人能有一些帮助. 简 ...

  9. Dalvik虚拟机总结

    一.Dalvik虚拟机启动 在启动Zygote进程时,会启动Dalvik虚拟机,完毕以下几件事: 1. 创建了一个Dalvik虚拟机实例: 2. 载入了Java核心类及注冊其JNI方法: 3. 为主线 ...

  10. ubuntu Shell

    Ubuntu下的ShellUbuntu的图形界面也是运行在Shell下的:虚拟终端机开启:Ctrl+Alt+F1~ F6 可以开启6个命令行的ShellCtrl+Alt+F7  开启图形终端机命令su ...