zoukankan      html  css  js  c++  java
  • 【BZOJ4052】[Cerc2013]Magical GCD 乱搞

    【BZOJ4052】[Cerc2013]Magical GCD

    Description

    给出一个长度在 100 000 以内的正整数序列,大小不超过 10^12。 
    求一个连续子序列,使得在所有的连续子序列中,它们的GCD值乘以它们的长度最大。

    Sample Input

    1
    5
    30 60 20 20 20

    Sample Output

    80

    题解:先思考暴力的做法。我们从一个数开始往左扫,将所有使得gcd改变的位置都记录下来。由于gcd的每次改变都至少/2,所以这样的位置不超过log个。

    那么我们直接从左往右扫,暴力维护所有使得gcd改变的位置即可。

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    using namespace std;
    typedef long long ll;
    const int maxn=100010;
    int n,m,k;
    ll ans;
    struct node
    {
    	int x;
    	ll g;
    }p[maxn],q[maxn];
    ll gcd(ll a,ll b)
    {
    	return (!b)?a:gcd(b,a%b);
    }
    inline ll rd()
    {
    	ll ret=0,f=1;	char gc=getchar();
    	while(gc<'0'||gc>'9')	{if(gc=='-')f=-f;	gc=getchar();}
    	while(gc>='0'&&gc<='9')	ret=ret*10+gc-'0',gc=getchar();
    	return ret*f;
    }
    void work()
    {
    	n=rd(),ans=0;
    	int i,j;
    	ll v;
    	m=0;
    	for(i=1;i<=n;i++)
    	{
    		v=rd();
    		for(j=1;j<=m;j++)	p[j].g=gcd(p[j].g,v);
    		p[++m].g=v,p[m].x=i;
    		for(k=0,j=1;j<=m;j++)	if(p[j].g>p[j-1].g)	q[++k]=p[j];
    		for(j=1;j<=k;j++)	p[j]=q[j],ans=max(ans,(i-p[j].x+1)*p[j].g);
    		m=k;
    	}
    	printf("%lld
    ",ans);
    }
    int main()
    {
    	int T=rd();
    	while(T--)	work();
    	return 0;
    }
  • 相关阅读:
    反射的概述_反射应用实例
    日期类之SimpleDateFormat
    StringBuffer & StringBuilder
    String与包装类_字节数组_字符数组间的转换
    两种方法k8s安装dashboard组件
    git学习
    Prometheus搭建
    python学习博客
    Python的全局变量和局部变量
    python参数
  • 原文地址:https://www.cnblogs.com/CQzhangyu/p/7421250.html
Copyright © 2011-2022 走看看