首页 > 其他分享 >题解:洛谷 P1890 gcd区间

题解:洛谷 P1890 gcd区间

时间:2024-07-08 20:41:01浏览次数:17  
标签:洛谷 gcd int 题解 线段 P1890 build

题解:洛谷 P1890 gcd区间

  • 标签:线段树,st表,分块,dp

题意

给定数列 \(a\),有 \(m\) 次询问求区间 \([l,r]\) 的最大公约数。

思路

这道题有多种写法,如标签所示。

线段树

线段树可以维护具有结合性的操作,很明显 \(\gcd\) 满足。

这道题线段树跑的慢是因为无修改操作,自然没有其他 \(O(1)\) 查询的快。

而代码很显然,一个建树一个查询即可。

复杂度 \(O(m\log n)\)。

其他做法暂时咕掉。

代码

线段树

#include<bits/stdc++.h>
#define i64 long long
#define L(a,b,c) for(int i=a;i<=b;i+=c)
#define R(a,b,c) for(int i=a;i>=b;i-=c)

using namespace std;

const int N=1e5+5,M=998244353;

int n,m,x,y,tree[4005],a[1005];

void build(int p,int l,int r){
  if(l==r){tree[p]=a[l];return;}
  int mid=l+r>>1;
  build(p<<1,l,mid);
  build(p<<1|1,mid+1,r);
  tree[p]=__gcd(tree[p<<1],tree[p<<1|1]);
}

int query(int p,int l,int r,int i,int j){
  if(i<=l&&r<=j) return tree[p];
  else{
    int mid=l+r>>1,k=0;
    if(i<=mid) k=query(p<<1,l,mid,i,j);
    if(j>mid) k=__gcd(k,query(p<<1|1,mid+1,r,i,j));
    return k;
  }
}

void solve();

signed main(){
  ios::sync_with_stdio(0);
  
  solve();
  
  return 0;
}

void solve(){
  cin>>n>>m;
  L(1,n,1) cin>>a[i];
  build(1,1,n);
  L(1,m,1){
    cin>>x>>y;
    cout<<query(1,1,n,x,y)<<endl;
  }
}

标签:洛谷,gcd,int,题解,线段,P1890,build
From: https://www.cnblogs.com/Jessie-Pu/p/18290664

相关文章

  • 题解:洛谷 P2678 [NOIP2015 提高组] 跳石头
    题解:洛谷P2678[NOIP2015提高组]跳石头标签:二分,贪心题意给定一个数列,\(a_0=0,a_{N+1}=L\),从其中删除不超过\(M\)个数,使得\(a_i-a_{i-1}\)的最小值最大。思路从最小值最大不难想到二分答案。统计\(a_i-a_j<mid\)的数量\(k\),如果不满足的话说明不删,\(j\getsi\)。......
  • VSCode中 npm install 安装依赖包太慢了,一直加载不出来问题解决
    1.问题描述采用VSCode打开别人传过来的项目时,需要先加载依赖包,一般是通过终端来加载:终端中输入npminstall. 但是采用npminstall安装依赖包出现问题,一直加载不完,卡到某一地方,如图: 2.尝试解决2.1采用淘宝镜像,依旧慢,最后证书过期2.2采用pnpminstall(做了一部分)npmins......
  • 题解:洛谷 P1843 奶牛晒衣服
    题解:洛谷P1843奶牛晒衣服标签:二分,贪心题意给定一个数列,每秒可以将所有数减\(a\),也可以选择一个数减\(b\),二者可同时进行,求让所有数小于等于\(0\)的最小秒数。思路要求最小的秒数,也就是刚好所有数字小于等于\(0\),且尽量大。这个秒数具有单调性,考虑二分答案。二分的......
  • CodeForces CF1980C Sofia and the Lost Operations 题解 但是最后TLE 仅供思路参考
    CodeForcesCF1980CSofiaandtheLostOperations题解嗨嗨,又来了啊,蒟蒻再来一篇题解SofiaandtheLostOperations题面翻译索菲亚有一个包含$n$个整数的数组$a[1],a[2],…,a[n]$。有一天她对这个数组感到厌倦,于是决定顺序地对其应用$m$个修改操作。每个修改操作由一......
  • 洛谷p1449后缀表达式题解
    #include<stdio.h>#include<stdlib.h>#defineMAXSIZE100typedeflongElemType;typedefstruct{ ElemType*base; ElemType*top; intStackSize;}sqStack;voidInitStack(sqStack*s){ s->base=(ElemType*)malloc (MAXSIZE*sizeof(ElemTyp......
  • 24暑期第三次训练C组题解
    目录A津津的储蓄计划auto遍历:B校门外的树memset()C杨辉三角DSpecialCharacters位运算&三目运算符EStrangeSplittingFStickogonGCardExchange构造结构体和重载运算符HLeastProductI选数JPeter的烟A津津的储蓄计划模拟题,按题意模拟即可.voidfunc(){ intjin......
  • WPF ComboBox数据绑定:初始化动态加载ItemsSource后首次赋值Text不显示问题解决
    原来:<ComboBoxText="{BindingItem}"ItemsSource="{BindingItemLists}"></ComboBox>privatevoidParas_Init(){ItemLists=newObservableCollection<string>();ItemLists.Add("111......
  • [BZOJ4350] 括号序列再战猪猪侠 题解
    我们设\(dp_{i,j}\)表示第\(i\)到第\(j\)个括号合并为序列且最外层不是括号\(i\)的可能性,\(f_{i,j}\)表示最外层是括号\(i\)的可能性。则有:\[\begin{cases}dp_{i,j}=\sumf_{i,k}(dp_{k+1,j}+f_{k+1,j})\\f_{i,j}=dp_{i+1,j}+f_{i+1,j}\end{cases}\]当然,并不是所......
  • [ABC210E] Ring MST 题解
    链接洛谷相应链接atcoder相应链接题意给n(1≤n≤......
  • CodeForces CF1986C Update Queries题解
    来吧,兄弟们,再来篇题解,其实也不是题解,是我自己的思路/心得/体会UpdateQueries题面翻译题目翻译一共$t$组数据,每组数据给定长度为$n$的字符串$s$,长度为$m$的$ind$数组和字符串$c$。你可以任意安排$ind$数组和字符串$c$的顺序,并按照此顺序对字符串$s$进行$m$......