C - Magical GCD UVALive - 6582 (STL )

来源:互联网 发布:网络优化培训费多少 编辑:程序博客网 时间:2024/04/26 03:55

题意:就是找个连续子序列,使得长度乘上这个子序列的gcd的值最大。

#include <bits/stdc++.h>using namespace std;#define ll long longmap<ll, ll>v;map<ll,ll>::iterator it,itt;ll a[110000];int main(){    int t;    scanf("%d", &t);      while(t--)    {          ll Max = -1;        int n;        v.clear();        scanf("%d",&n);        for(int i = 1; i <= n; i++)        {            scanf("%lld", &a[i]);            Max = max(a[i], Max);            for(it= v.begin(); it != v.end();it++)            {                if(__gcd(it->first,a[i]) != it->first)                {                    if(v[__gcd(it->first,a[i])] == 0)                    v[__gcd(it->first,a[i])] = it->second;                     itt = it++;                    v.erase(itt);                    it--;                }            }            if(!v[a[i]])                v[a[i]]=i;            for(it = v.begin(); it != v.end(); it++)            {                Max = max(Max, (it->first)*(i - it->second + 1));            }        }        printf("%lld\n",Max);    }    return 0;}

#include <bits/stdc++.h>using namespace std;#define ll long longmap<ll, ll>v;int main(){    int t;    ll x;    scanf("%d", &t);    while(t--)    {        v.clear();        int n;        scanf("%d", &n);        ll ans = -1;        for(int i = 1; i <= n; i++)        {            scanf("%lld",&x);            if(!v.count(x))                v[x] = i;            for(map<ll, ll>::iterator  it = v.begin(); it!= v.end(); )            {                ll tmp = __gcd(it->first, x);                ans = max(ans, (tmp)*(i-it->second+1));                if(!v.count(tmp))                {                     v[tmp] = it->second;                }                else                {                     v[tmp] = min(v[tmp],it->second);                }                if(tmp<it->first) v.erase(it++);                else it++;            }        }        printf("%lld\n",ans);    }}


0 0