BZOJ 4488:[Jsoi2015]最大公约数 UPC:2018山东冬令营 权值 (GCD)

本文主要是介绍BZOJ 4488:[Jsoi2015]最大公约数 UPC:2018山东冬令营 权值 (GCD),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

时间限制: 1 Sec   内存限制: 512 MB
提交: 57   解决: 19
[ 提交][ 状态][ 讨论版][命题人: admin]

题目描述

给定一个长为n的正整数序列Ai。对于它的任意一个连续的子序列{Al, Al+1, ..., Ar}, 定义其权值W (l, r)为其长度与序列中所有元素的最大公约数的乘积,即W (l, r)  = (r − l + 1) × gcd(Al, Al+1, .., Ar )。
你需要输出权值最大的子序列的权值

输入

第一行一个正整数n。
第二行n个正整数,表示序列Ai。

输出

一行一个正整数,表示答案。

样例输入

5

30 60 20 20 20

样例输出

80

提示

最后四个元素形成的子序列权值最大。

对于前30%的数据:n ≤ 2000
对于所有数据:1 ≤ n ≤ 105,1 ≤ Ai ≤ 109

来源

2018山东冬令营 


【思路】

    有一个定理  :    长度为n的子序列中  , GCD 最多为log(n)  

    在 BZOJ 上 这个 时间限度时 10s 在 upc 上 限定1s  ;  

    很尬尬的用 Map 数组,  在bzoj上跑1s  在  upc 上 跑1092ms  差一丢丢  就是过不去;

    改用数组标记 时间 降到128ms  ,  说明UPC 对 STL 库 的支持 不是很好哇;

    固定右端点(枚举右端点)     去掉重复的 gcd ,  延伸最左端点能达到最长;

    map 的话 不断翻滚,  数组  是去重


【代码实现】

STL map的‘

#include <iostream>
#include <bits/stdc++.h>
#define mem(a,b) memset(a,b,sizeof(a))
typedef long long ll;
const ll INF=0x3f3f3f3f;
const int MAXN=1e5+5;
const int MOD=1e9+7;using namespace std;inline ll gcd(ll a,ll b) { return b? gcd(b,a%b):a;}ll a[MAXN];map<ll,ll>mp,tmp;
map<ll,ll>::iterator it;
int main()
{int n;ll ans=-INF;scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%lld",&a[i]);for(int i=1;i<=n;i++){ans=max(ans,a[i]);for(it=mp.begin();it!=mp.end();it++){ll now_gcd = gcd(it->first,a[i]);ans= max(ans, now_gcd*(i-it->second+1));if(!tmp[now_gcd])tmp[now_gcd]=(it->second);elsetmp[now_gcd]= min(tmp[now_gcd],it->second); // 取left最远}if(!tmp[a[i]])tmp[a[i]]=i;mp=tmp;tmp.clear();}printf("%lld",ans);return 0;
}


用数组标记的  128ms 

#include <iostream>
#include <bits/stdc++.h>
#define mem(a,b) memset(a,b,sizeof(a))
typedef long long ll;
const ll INF=0x3f3f3f3f;
const int MAXN=1e5+5;
const int MOD=1e9+7;using namespace std;inline ll gcd(ll a,ll b) { return b? gcd(b,a%b):a;}ll col[MAXN];
ll gc[MAXN];
ll a[MAXN];
map<ll,ll>mp,tmp;
map<ll,ll>::iterator it;
int main()
{int n;ll ans=-INF;int k=0,cot;scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%lld",&a[i]);for(int i=1;i<=n;i++){col[++k]=i;gc[k]=a[i];for(int j=k-1;j>=1;j--)gc[j]=gcd(gc[j],gc[j+1]);int cot=0;for(int j=1;j<=k;){gc[++cot]=gc[j];col[cot]=col[j];while(gc[cot]==gc[j]) j++;}k=cot;for(int j=1;j<=k;j++){ans=max(ans,gc[j]*(i-col[j]+1));}}printf("%lld",ans);return 0;
}

123

这篇关于BZOJ 4488:[Jsoi2015]最大公约数 UPC:2018山东冬令营 权值 (GCD)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/565814

相关文章

BUUCTF靶场[web][极客大挑战 2019]Http、[HCTF 2018]admin

目录   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 [web][HCTF 2018]admin 考点:弱密码字典爆破 四种方法:   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 访问环境 老规矩,我们先查看源代码

2018秋招C/C++面试题总结

博主从8月中旬开始大大小小面试了十几家公司,至今也许是告一段落吧,希望后面会有好结果,因此总结记录一些C/C++方向常见的问题。和大家一起学习! 参考了互联网的各种资源,自己尝试归类整理,谢谢~ 一、C和C++的区别是什么? C是面向过程的语言,C++是在C语言的基础上开发的一种面向对象编程语言,应用广泛。 C中函数不能进行重载,C++函数可以重载 C++在C的基础上增添类,C是一个结构

大厂算法例题解之网易2018秋招笔试真题 (未完)

1、字符串碎片 【题目描述】一个由小写字母组成的字符串可以看成一些同一字母的最大碎片组成的。例如,“aaabbaaac” 是由下面碎片组成的:‘aaa’,‘bb’,‘c’。牛牛现在给定一个字符串,请你帮助计算这个字符串的所有碎片的 平均长度是多少。 输入描述: 输入包括一个字符串 s,字符串 s 的长度 length(1 ≤ length ≤ 50),s 只含小写字母(‘a’-‘z’) 输出描述

vulhub GhostScript 沙箱绕过(CVE-2018-16509)

1.执行以下命令启动靶场环境并在浏览器访问 cd vulhub/ghostscript/CVE-2018-16509 #进入漏洞环境所在目录   docker-compose up -d #启动靶场   docker ps #查看容器信息 2.访问网页 3.下载包含payload的png文件 vulhub/ghostscript/CVE-2018-16509/poc.png at

每日一题~cf 970 div3 (A思维,B小模拟,C二分,D排列数建图成环,E 26个字母暴力+前缀和,F 逆元,G 数论gcd )

A 题意: 有 a 个1 ,b 个2.问是否能将这些数划分为两个数值相等的集合。 输出 YES 或者 NO —————— 问题等价于 将数组 分成两个数值相同的数组。所以sum 应该是偶数。也就是说 1 的个数是偶数。在i1的个数是偶数的情况下,将 2 分成两份,如果2 的个数是偶数,OK。如果是奇数那么需要1来补齐,如果1 的个数大于等于2那么可以补齐。(1 的个数是偶数,需要2个1来补齐,剩下

Python JAVA接口UTC 时间 '2018-08-06T10:00:00.000Z' 格式转化为本地时间

Python JAVA接口UTC 时间 '2018-08-06T10:00:00.000Z' 格式转化为本地时间 方法1 import datetimeorigin_date_str= "2019-07-26T08:20:54Z"utc_date = datetime.datetime.strptime(origin_date_str, "%Y-%m-%dT%H:%M:%SZ")loca

js,找出两个数的最大公约数

/*比如说有要求a、b两个整数的最大公约数,a>b,那么我们先用a除以b,得到商8,余数r1:a÷b=q1…r1 我们当然也可以把上面这个式子改写成乘法式:a=b*q1+r1     如果r1=0,那么b就是a、b的最大公约数。 要是r1≠0,就继续除,用b除以r1,我们也可以有和上面一样的式子:b=r1*q2+r2    如果余数r2=0,那么r1就是所求的最大公约数。*/ fun

iOS——GCD再学习

GCD 使用GCD好处,具体如下: GCD 可用于多核的并行运算;GCD 会自动利用更多的 CPU 内核(比如双核、四核);GCD 会自动管理线程的生命周期(创建线程、调度任务、销毁线程);程序员只需要告诉 GCD 想要执行什么任务,不需要编写任何线程管理代码。 任务与队列 概念 **任务:就是执行操作的意思,换句话说就是你在线程中执行的那段代码。**在 GCD 中是放在 block 中

GCD常用函数拾遗

目录 dispatch_block_t监听block执行结束dispatch_block_waitdispatch_block_notify 撤销block总结参考 这几天偶尔又回顾了下GCD的知识。之前我一直以为自己对于GCD已经大体有个整体掌握了,却发现仍还有一些知识点的遗漏。于是写在这里,算是对之前GCD常用函数文章的补充。 dispatch_block_t 在GCD中

【BZOJ】1324 Exca王者之剑 最大权独立集

传送门:【BZOJ】1324  Exca王者之剑 题目分析:赤裸裸的最大权独立集。。。最小割解决 代码如下: #include <cstdio>#include <vector>#include <cstring>#include <algorithm>using namespace std ;#define REP( i , a , b ) for ( int