ECNU 3480 没用的函数 (ST表预处理 + GCD性质)
这题卡了双$log$的做法
令$gcd(a_{i}, a_{i+1}, a_{i+2}, ..., a_{j}) = calc(i, j)$
根据最大公约数的性质我们知道一个数和另一个数求$gcd$之后如果变小了,那么结果小于等于之前那个数的$1/2$
所以在考虑$a_{i}$的时候,
$calc(1, i), calc(2, i), calc(3, i), ..., calc(i, i)$这些数去重之后最多只有$logC$个不同的数
在考虑$a_{i}$之前把整个数列看成$logC$段,每一段先与$a_{i}$合并,然后再对每段分别求前缀和的最小值
(求出来的最小值是要被减去的)
分别更新答案即可。
注意特判$0$的情况,为了方便索性我把数列中的$0$都去掉了,出现$0$的话就把初始$ans$设成$0$
时间复杂度$O(nlogC), C = max(a_{i})$ (这里我忽略了$STL$自带的复杂度)
#include <bits/stdc++.h> using namespace std; #define rep(i, a, b) for (int i(a); i <= (b); ++i)
#define dec(i, a, b) for (int i(a); i >= (b); --i)
#define MP make_pair
#define fi first
#define se second typedef long long LL;
typedef pair <LL, LL> PII; const int N = 1e6 + 10;
const int A = 21; LL a[N], s[N], f[N][A];
LL ans;
vector <PII> v1, v2;
map <LL, LL> mp;
int n, m, flag;
int lg[N]; LL gcd(LL a, LL b){
return b == 0 ? a : gcd(b, a % b);
} void init(){
rep(i, 1, n + 1) f[i][0] = s[i - 1];
rep(j, 1, 20) rep(i, 1, n + 1)
if ((i + (1 << j) - 1) <= n + 1) f[i][j] = min(f[i][j - 1], f[i + (1 << (j - 1))][j - 1]);
} inline LL calc(int l, int r){
if (l > r) return 0;
int k = lg[r - l + 1];
return min(f[l][k], f[r - (1 << k) + 1][k]);
} inline void solve(int x, int y){
if (!mp.count(x)) mp[x] = y;
else mp[x] = min(mp[x], (LL)y);
} int main(){ lg[1] = 0; rep(i, 2, 1e6 + 1) lg[i] = lg[i >> 1] + 1; scanf("%d", &n);
m = 0;
flag = 1;
rep(i, 1, n){
LL x;
scanf("%lld", &x);
if (x) a[++m] = x;
else flag = 0;
}
n = m; ans = 1ll * flag * (-9e18);
rep(i, 1, n) s[i] = s[i - 1] + a[i];
init(); rep(i, 1, n){
LL cnt = abs(a[i]);
mp.clear();
for (auto u : v1) solve(gcd(u.fi, cnt), u.se);
solve(cnt, i);
v1.clear();
for (auto u : mp) v1.push_back(MP(u.fi, u.se));
int sz = v1.size(); for (int j = 0; j < sz; ++j){
PII u = v1[j];
int r;
if (j == sz - 1) r = i; else r = v1[j + 1].se - 1;
ans = max(ans, (s[i] - calc(u.se, r)) * u.fi);
} } printf("%lld\n", ans);
return 0;
}
ECNU 3480 没用的函数 (ST表预处理 + GCD性质)的更多相关文章
- BZOj 4540: [Hnoi2016]序列 [莫队 st表 预处理]
4540: [Hnoi2016]序列 题意:询问区间所有子串的最小值的和 不强制在线当然上莫队啦 但是没想出来,因为不知道该维护当前区间的什么信息,维护前后缀最小值的话不好做 想到单调栈求一下,但是对 ...
- [bzoj4540][Hnoi2016][序列] (莫队算法+单调栈+st表)
Description 给定长度为n的序列:a1,a2,…,an,记为a[1:n].类似地,a[l:r](1≤l≤r≤N)是指序列:al,al+1,…,ar-1,ar.若1≤l≤s≤t≤r≤n,则称a ...
- 数据结构进阶:ST表
简介 ST 表是用于解决 可重复贡献问题 的数据结构. 什么是可重复贡献问题? 可重复贡献问题 是指对于运算 \(\operatorname{opt}\) ,满足 \(x\operatorname ...
- HDU 5875 Function(ST表+二分)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5875 [题目大意] 给出一个数列,同时给出多个询问,每个询问给出一个区间,要求算出区间从左边开始不 ...
- Codeforces 873E Awards For Contestants ST表
原文链接https://www.cnblogs.com/zhouzhendong/p/9255885.html 题目传送门 - CF873E 题意 现在要给 $n(n\leq 3000)$ 个学生颁奖 ...
- UOJ#219/BZOJ4650 [NOI2016]优秀的拆分 字符串 SA ST表
原文链接http://www.cnblogs.com/zhouzhendong/p/9025092.html 题目传送门 - UOJ#219 (推荐,题面清晰) 题目传送门 - BZOJ4650 题意 ...
- bzoj3277 串 (后缀数组+二分答案+ST表)
常见操作:先把所有串都连到一起,但中间加上一个特殊的符号(不能在原串中/出现过)作为分割 由于全部的子串就等于所有后缀的所有前缀,那我们对于每一个后缀,去求一个最长的前缀,来满足这个前缀在至少K个原串 ...
- POJ 3264 Balanced Lineup 【ST表 静态RMQ】
传送门:http://poj.org/problem?id=3264 Balanced Lineup Time Limit: 5000MS Memory Limit: 65536K Total S ...
- 【Codeforces Round #466】E. Cashback DP+ST表
题意 给定$n$个数,将其划分成若干个连续的子序列,求最小价值,数组价值定义为,数组和减去$\lfloor \frac{k}{c} \rfloor$,$k$为数组长度,$c$为给定数 可以列得朴素方程 ...
随机推荐
- (洛谷)P1019 单词接龙
题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的"龙"(每个单词都最多在"龙" ...
- 字符编码,ASCII、Unicode与UTF-8的理解
首先我们先要明白的两点是:1.计算机中的信息都是由二进制的0和1储存的:2.我们再计算机屏幕上看到的各种字符都是计算机系统按照一定的规则将二进制数字转换而来的. 一.基本概念. 1.字符集(chars ...
- 朴素贝叶斯python小样本实例
朴素贝叶斯优点:在数据较少的情况下仍然有效,可以处理多类别问题缺点:对于输入数据的准备方式较为敏感适用数据类型:标称型数据朴素贝叶斯决策理论的核心思想:选择具有最高概率的决策朴素贝叶斯的一般过程(1) ...
- day18 js 正则,UI框架,Django helloworld 以及完整工作流程
JS正则: text 判断字符串是否符合规定的正则表达式 exec 获取匹配的数据 默认情况下: 只要能匹配到就返回true 否则返回false 只匹配数字: 所以J ...
- Django基础之数据库与ORM
一.数据库配置 1.django默认支持sqlite,mysql, oracle,postgresql数据库. django默认使用sqlite的数据库,默认自带sqlite的数据库驱动 , 引擎名称 ...
- cf936c Lock Puzzle
ref #include <algorithm> #include <iostream> #include <cstring> #include <cstdi ...
- 矩阵儿快速幂 - POJ 3233 矩阵力量系列
不要管上面的标题的bug 那是幂的意思,不是力量... POJ 3233 Matrix Power Series 描述 Given a n × n matrix A and a positive in ...
- NodeJs初学者经典入门解析
Node.js 是一个基于谷歌浏览器JavaScript执行环境建立的一个平台,让JavaScript可以脱离客户端浏览器运行,让 JavaScript具有服务器语言的能力.我们可以使用NodeJs方 ...
- 图说不为人知的IT传奇故事-3-硅谷DNA创造者HP
此系列文章为“图说不为人知的IT传奇故事”,各位大忙人可以在一分钟甚至几秒内了解把握整个内容,真可谓“大忙人的福利”呀!!希望各位IT界的朋友在钻研技术的同时,也能在文学.历史上有所把握.了解这些故事 ...
- BugKu 杂项-这么多数据包
前边的都是些无关紧要,只要有点网络的基础我想应该都能懂,往下看,一直到NO104,这是在干什么? 源ip138一直向目标ip159发送syn握手包,想要建立连接,其实就是端口扫描,原理就是,想和你某个 ...