HDOJ-4961 Boring Sum

来源:互联网 发布:校园网络推广 编辑:程序博客网 时间:2024/05/16 23:49

数据量100000,N * sqrt(N)的复杂度本以为会TLE,谁会400+MS过。。。。。。


#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <queue>#include <stack>#include <cmath>#include <cstdlib>#include <vector>#include <map>using namespace std;const int maxn = 100010;long long num[maxn];int vis[maxn],f[maxn], g[maxn];int main(){    int n;    while(~scanf("%d", &n) && n)    {        memset(vis, 0, sizeof(vis));        memset(f, 0, sizeof(f));        memset(g, 0, sizeof(g));        for(int i = 1; i <= n; i++)            scanf("%I64d", &num[i]);        for(int i = 1; i <= n; i++)        {            for(int j = sqrt(num[i]); j >= 1; j--)            {                if(num[i] % j == 0)                {                    if(vis[j] && g[vis[j]] == 0)                        g[vis[j]] = i;                    if(vis[num[i]/j] && g[vis[num[i]/j]] == 0)                        g[vis[num[i]/j]] = i;                }            }            vis[num[i]] = i;        }        for(int i = 1; i <= n; i++)        {            if(g[i] == 0) g[i] = i;        }        memset(vis, 0, sizeof(vis));        for(int i = n; i > 0; i--)        {            for(int j = sqrt(num[i]); j >= 1; j--)            {                if(num[i] % j == 0)                {                    if(vis[j] && f[vis[j]] == 0)                        f[vis[j]] = i;                    if(vis[num[i]/j] && f[vis[num[i]/j]] == 0)                        f[vis[num[i]/j]] = i;                }            }            vis[num[i]] = i;        }        for(int i = 1; i <= n; i++)            if(f[i] == 0) f[i] = i;        long long ans = 0;        for(int i = 1; i <= n; i++)            ans = ans + num[f[i]] * num[g[i]];        cout << ans << endl;    }}


0 0
原创粉丝点击