首页 > 其他分享 >246. 区间最大公约数

246. 区间最大公约数

时间:2024-03-04 10:55:06浏览次数:23  
标签:Node int LL tr 最大公约数 246 区间 include sum

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

typedef long long LL;

const int N = 500010;

int n, m;
LL w[N];
struct Node
{
    int l, r;
    LL sum, d;
}tr[N * 4];

LL gcd(LL a, LL b)
{
    return b ? gcd(b, a % b) : a;
}

void pushup(Node &u, Node &l, Node &r)
{
    u.sum = l.sum + r.sum;
    u.d = gcd(l.d, r.d);
}

void pushup(int u)
{
    pushup(tr[u], tr[u << 1], tr[u << 1 | 1]);
}

void build(int u, int l, int r)
{
    if (l == r)
    {
        LL b = w[r] - w[r - 1];
        tr[u] = {l, r, b, b};
    }
    else
    {
        tr[u].l = l, tr[u].r = r;
        int mid = l + r >> 1;
        build(u << 1, l, mid), build(u << 1 | 1, mid + 1, r);
        pushup(u);
    }
}

void modify(int u, int x, LL v)
{
    if (tr[u].l == x && tr[u].r == x)
    {
        LL b = tr[u].sum + v;
        tr[u] = {x, x, b, b};
    }
    else
    {
        int mid = tr[u].l + tr[u].r >> 1;
        if (x <= mid) modify(u << 1, x, v);
        else modify(u << 1 | 1, x, v);
        pushup(u);
    }
}

Node query(int u, int l, int r)
{
    if (tr[u].l >= l && tr[u].r <= r) return tr[u];
    else
    {
        int mid = tr[u].l + tr[u].r >> 1;
        if (r <= mid) return query(u << 1, l, r);
        else if (l > mid) return query(u << 1 | 1, l, r);
        else
        {
            auto left = query(u << 1, l, r);
            auto right = query(u << 1 | 1, l, r);
            Node res;
            pushup(res, left, right);
            return res;
        }
    }
}

int main()
{
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; i ++ ) scanf("%lld", &w[i]);
    build(1, 1, n);

    int l, r;
    LL d;
    char op[2];
    while (m -- )
    {
        scanf("%s%d%d", op, &l, &r);
        if (*op == 'Q')
        {
            auto left = query(1, 1, l);
            Node right({0, 0, 0, 0});
            if (l + 1 <= r) right = query(1, l + 1, r);
            printf("%lld\n", abs(gcd(left.sum, right.d)));
        }
        else
        {
            scanf("%lld", &d);
            modify(1, l, d);
            if (r + 1 <= n) modify(1, r + 1, -d);
        }
    }

    return 0;
}

注意query里面要取绝对值,因为题目中可能会出现负数。

标签:Node,int,LL,tr,最大公约数,246,区间,include,sum
From: https://www.cnblogs.com/smartljy/p/18051373

相关文章

  • 最大字段和,区间矩阵
    最大字段和原题链接:P1115最大子段和-洛谷|计算机科学教育新生态(luogu.com.cn)解析:经典动态规划:最大子数组问题-知乎(zhihu.com)我写的代码:#include<iostream>#include<algorithm>#include<cstring>usingnamespacestd;constintN=2e5+10;inta[N],dp[N]......
  • 区间问最大值位置
     #include<iostream>#include<cstring>#include<unordered_map>#include<vector>#include<algorithm>usingnamespacestd;constintN=1e6;#definek1k<<1#definek2k<<1|1#defineintlonglongint......
  • 56. 合并区间(中)
    目录题目法一、排序+讨论法二、简洁题目以数组intervals表示若干个区间的集合,其中单个区间为intervals[i]=[starti,endi]。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。示例1:输入:intervals=[[1,3],[2,6],[8,10],[15,1......
  • R语言GAMLSS模型对艾滋病病例、降雪量数据拟合、预测、置信区间实例可视化|附代码数据
    全文链接:http://tecdat.cn/?p=31996原文出处:拓端数据部落公众号最近我们被客户要求撰写关于GAMLSS的研究报告,包括一些图形和统计输出。GAMLSS模型是一种半参数回归模型,参数性体现在需要对响应变量作参数化分布的假设,非参数性体现在模型中解释变量的函数可以涉及非参数平滑函数,......
  • 聊聊maven指定version区间的妙用
    前言在我们开发微服务项目的过程中,难免会依赖各种jar,开发环境可能引用1.0.0-SNAPSHOT,而到了正式环境,则需要引用1.0.0。之前我们的做法是通过pom配置profile来达到不同环境,使用不同的版本。形如下<profiles><!--开发环境--><profile><properti......
  • 通达信活跃区间启动指标公式源码头副图
    {股票指标}上市天数:=BARSCOUNT(C);日期限制:=IF((DATE<=1991231),1,1);ma5:=MA(CLOSE,5);MA10:=MA(CLOSE,10);MA20:=MA(CLOSE,20);EMA60:=EMA(CLOSE,60);MAXX:=IF((上市天数>100),EMA60,MA20);均线乖离:=((MA10-EMA60)/EMA60);低吸条件:=((CLOSE/REF(CLOS......
  • 区间操作优化算法
    1.树状数组一般为求区间的和并统计某个特定值的数量,同时可以进行快速的在线更新。不算特别重要,简略带过。看例题点击查看代码#include<bits/stdc++.h>usingnamespacestd;constintN=300000;intn,c[N],s[N];structlmy{ intx,y;}site[N];intlowbit(intx){ r......
  • 区间过滤 课程章节接口
    区间过滤#借助django-filter实现区间过滤#实现区间过滤##########1filters.pyclassCourseFilterSet(FilterSet):#课程的价格范围要大于min_price,小于max_pricemin_price=filters.NumberFilter(field_name='price',lookup_expr='gt')max_price=filt......
  • 区间最大子区间和——山海经题解
    区间最大子区间和规定:ls:区间靠左部分子区间最大和rs:区间靠右部分子区间最大和ms:区间子区间最大和s:区间和方程与数量关系如图所示,可以用动态规划解决山海经题解这题是上述方法在线段树中的应用solution#include<bits/stdc++.h>usingnamespacestd;constintmax......
  • 区间dp
    Ø合并:意思就是将两个或多个部分进行整合,当然也可以反过来,也就是是将一个问题进行分解成两个或多个部分。Ø特征:能将问题分解成为两两合并的形式Ø求解:对整个问题设最优值,枚举合并点,将问题分解成为左右两个部分,最后将左右两个部分的最优值进行合并得到原问题的最优值。有点类......