hdu 4961 Boring Sum(高效)
pid=4961" target="_blank" style="">题目链接:hdu 4961 Boring Sum
题目大意:给定ai数组;
- 构造bi, k=max(j|0<j<i,aj%ai=0), bi=ak;
- 构造ci, k=min(j|i<j≤n,aj%ai=0), ci=ak;
求∑i=1nbi∗ci
解题思路:由于ai≤105,所以预先处理好每一个数的因子,然后在处理bi,ci数组的时候,每次遍历一个数。就将其全部的因子更新,对于bi维护最大值,对于ci维护最小值。
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxn = 1e5;
const int INF = 0x3f3f3f3f;
int n, arr[maxn+5], b[maxn+5], c[maxn+5], v[maxn+5];
vector<int> g[maxn+5];
void get_factor (int n) {
for (int i = 1; i <= n; i++)
g[i].clear();
for (int i = 1; i <= n; i++) {
for (int j = i; j <= n; j += i)
g[j].push_back(i);
}
}
void init () {
memset(v, 0, sizeof(v));
for (int i = 1; i <= n; i++) {
int u = arr[i];
int k = (v[u] == 0 ? i :v[u]);
b[i] = arr[k];
for (int j = 0; j < g[u].size(); j++)
v[g[u][j]] = max(v[g[u][j]], i);
}
memset(v, INF, sizeof(v));
for (int i = n; i >= 1; i--) {
int u = arr[i];
int k = (v[u] == INF ? i : v[u]);
c[i] = arr[k];
for (int j = 0; j < g[u].size(); j++)
v[g[u][j]] = min(v[g[u][j]], i);
}
}
int main () {
get_factor(maxn);
while (scanf("%d", &n) == 1 && n) {
for (int i = 1; i <= n; i++)
scanf("%d", &arr[i]);
init();
ll ans = 0;
for (int i = 1; i <= n; i++)
ans = ans + b[i] * 1LL * c[i];
printf("%I64d\n", ans);
}
return 0;
}
hdu 4961 Boring Sum(高效)的更多相关文章
- hdu 4961 Boring Sum(数学题)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4961 Problem Description Number theory is interesting ...
- hdu 4961 Boring Sum
Boring Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Tota ...
- hdu 4961 Boring Sum (思维 哈希 扫描)
题目链接 题意:给你一个数组,让你生成两个新的数组,A要求每个数如果能在它的前面找个最近的一个是它倍数的数,那就变成那个数,否则是自己,C是往后找,输出交叉相乘的和 分析: 这个题这种做法是O(n*s ...
- HDOJ 4961 Boring Sum
Discription Number theory is interesting, while this problem is boring. Here is the problem. Given a ...
- HDU 1024 Max Sum Plus Plus --- dp+滚动数组
HDU 1024 题目大意:给定m和n以及n个数,求n个数的m个连续子系列的最大值,要求子序列不想交. 解题思路:<1>动态规划,定义状态dp[i][j]表示序列前j个数的i段子序列的值, ...
- HDU 1003 Max Sum --- 经典DP
HDU 1003 相关链接 HDU 1231题解 题目大意:给定序列个数n及n个数,求该序列的最大连续子序列的和,要求输出最大连续子序列的和以及子序列的首位位置 解题思路:经典DP,可以定义 ...
- HDU 1244 Max Sum Plus Plus Plus
虽然这道题看起来和 HDU 1024 Max Sum Plus Plus 看起来很像,可是感觉这道题比1024要简单一些 前面WA了几次,因为我开始把dp[22][maxn]写成dp[maxn][2 ...
- hdu 3415 Max Sum of Max-K-sub-sequence(单调队列)
题目链接:hdu 3415 Max Sum of Max-K-sub-sequence 题意: 给你一串形成环的数,让你找一段长度不大于k的子段使得和最大. 题解: 我们先把头和尾拼起来,令前i个数的 ...
- HDU 1024 Max Sum Plus Plus (动态规划)
HDU 1024 Max Sum Plus Plus (动态规划) Description Now I think you have got an AC in Ignatius.L's "M ...
随机推荐
- spark深入:配置文件与日志
一.第一部分 1.spark2.1与hadoop2.7.3集成,spark on yarn模式下,需要对hadoop的配置文件yarn-site.xml增加内容,如下: <property> ...
- Ngxtop-Nginx日志实时分析利器
ngxtop实时解析nginx访问日志,并且将处理结果输出到终端,功能类似于系统命令top,所以这个软件起名ngxtop.有了ngxtop,你可以实时了解到当前nginx的访问状况,再也不需要tail ...
- libFM 简介
原文:https://eachcloudcn.blob.core.chinacloudapi.cn/clips/XOI1W.htm libFM全称为Factorization Machine Libr ...
- oracle client字符集设置 乱码问题
程序员经常要连接数据库 下面 就说一下 oracle数据库 客户端与服务器端 字符集一致性的问题 这可以解决中文乱码,其他字符乱码问题 主要是指在sqlplus中,其他类似toad/pls ...
- 在 Win 7 下使用 VirtualBOX 虚拟机安装 OS X 10.9 Mavericks 及 Xcode 5
参考网址:http://bbs.feng.com/read-htm-tid-7625465.html
- IT创业失败案例解析 - 第一篇
创业启示录:创业失败报告这个系列包括30多家创业公司的失败案例分析.本文就有由其中一家IT创业公司的CTO所撰写.还是那句老话,成功的故事固然非常鼓舞人心,但我们也可以从失败故事中学到很多. 以下是译 ...
- 在 linux 下使用 CMake 构建应用程序
学习cmake http://xwz.me/wiki/doku.php?id=cmake 碰到的一些问题: 1.You have changed variables that require your ...
- 上传app store 应用指南链接--2
http://www.docin.com/p-166876874.html http://jamesli.cn/blog/?p=955 http://www.adobe.com/devnet/flas ...
- wepy - 与原生有什么不同(单文件模式)
小程序采用同文件夹(文件名),统一通过app.json来管理 而vue以及wepy采用的是单文件模式(js.html.css)合并在一起了! wepy单文件模式 <style> .ok{ ...
- 很不错标签云js插件
在蓝色看到有需要标签云的球形效果,我记得之前在网上见到过,印象比较深刻,就找出地址发给他了,接下来却还有人需要这个效果的JQuery插件,网上好像也有,但是我看现在这个就不错,就想想自己改成jquer ...