设为首页 加入收藏

TOP

hdu 4961 Boring Sum(高效)
2015-07-20 17:52:03 来源: 作者: 【 】 浏览:2
Tags:hdu 4961 Boring Sum 高效

题目链接:hdu 4961 Boring Sum

题目大意:给定ai数组;

  • 构造bi, k=max(j|0 构造ci, k=min(j|i 求∑i=1nbi?ci

    解题思路:因为ai≤105,所以预先处理好每个数的因子,然后在处理bi,ci数组的时候,每次遍历一个数,就将其所有的因子更新,对于bi维护最大值,对于ci维护最小值。

    #include 
           
             #include 
            
              #include 
             
               #include 
              
                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
               
                 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; }
               
              
             
            
           
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇009实现一个算法来删除单链表中的.. 下一篇UVa 11168 Airport , 凸包

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: