hdu6025-构造or线段树

来源:互联网 发布:淘宝企业店铺怎么发货 编辑:程序博客网 时间:2024/05/17 20:28


链接:点击打开链接


解题思路:这题可以线段树树可以直接记前驱,后继的GCD然后枚举就OK了。


构造代码:

#include<cstdio>#include<cstring>#include<cmath>#include<iostream>#include<sstream>#include<iterator>#include<algorithm>const double eps = 1e-8;typedef long long LL;using namespace std;const int MAXN=100010; int a[MAXN];int prefix[MAXN];int suffix[MAXN];int gcd(int a, int b){    return !b ? a : gcd(b, a % b);}int main(){    int T;    scanf("%d", &T);    while(T--){        memset(prefix, 0, sizeof prefix);        memset(suffix, 0, sizeof suffix);        int n;        scanf("%d", &n);        for(int i = 0; i < n; ++i){            scanf("%d", &a[i]);        }        prefix[0] = a[0];        for(int i = 1; i < n; ++i){            prefix[i] = gcd(prefix[i - 1], a[i]);        }        suffix[n - 1] = a[n - 1];        for(int i = n - 2; i >= 0; --i){            suffix[i] = gcd(suffix[i + 1], a[i]);        }        int ans = max(suffix[1], prefix[n - 2]);        for(int i = 1; i < n - 1; ++i){            ans = max(ans, gcd(prefix[i - 1], suffix[i + 1]));        }        printf("%d\n", ans);    }    return 0;}
线段树:

#include<cstdio>#include<algorithm>#include<cstring>#include<iostream>#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1using namespace std;typedef long long ll;const int mx=100010,mod=1e9+7;int n,m;int sum[mx<<2];int gcd(int a,int b){return b==0? a:gcd(b,a%b);}void build(int l,int r,int rt){if(l==r){scanf("%d",sum+rt);return ;}int m=(l+r)>>1;build(lson);build(rson);sum[rt]=gcd(sum[rt<<1],sum[rt<<1|1]);}int query(int L,int R,int l,int r,int rt){if(L<=l&&R>=r)  return sum[rt];int m=(l+r)>>1;int ans=0;if(m>=L)  ans=query(L,R,lson);if(m<R)   ans= ans==0? query(L,R,rson): gcd(ans,query(L,R,rson));return ans;}int main(){int t;scanf("%d",&t);while(t--){cin>>n;build(1,n,1);int ans=query(2,n,1,n,1);ans=max(ans,query(1,n-1,1,n,1));for(int i=2;i<n;i++){int v=query(1,i-1,1,n,1),u=query(i+1,n,1,n,1);ans=max(ans,gcd(u,v));}cout<<ans<<endl;}return 0;}




0 0