洛谷 P10463 Interval GCD Solution

Description

给定序列 a = ( a 1 , a 2 , ⋯ , a n ) a=(a_1,a_2,\cdots,a_n) a=(a1,a2,,an),有 m m m 个操作分两种:

  • add ⁡ ( l , r , k ) \operatorname{add}(l,r,k) add(l,r,k):对每个 i ∈ [ l , r ] i\in[l,r] i[l,r] 执行 a i ← a i + k a_i\gets a_i+k aiai+k.
  • query ⁡ ( l , r ) \operatorname{query}(l,r) query(l,r):求 ∣ gcd ⁡ ( a l , a l + 1 , ⋯ , a r ) ∣ |\gcd(a_l,a_{l+1},\cdots,a_r)| gcd(al,al+1,,ar).

Limitations

1 ≤ n ≤ 5 × 1 0 5 1 \le n \le 5\times 10^5 1n5×105
1 ≤ m ≤ 1 0 5 1 \le m \le 10^5 1m105
1 ≤ a i ≤ 1 0 18 1 \le a_i \le 10^{18} 1ai1018
∣ k ∣ ≤ 1 0 18 |k|\le 10^{18} k1018
任意时刻所有数均在 2 63 2^{63} 263 以内.
1 s , 512 MB 1\text{s},512\text{MB} 1s,512MB

Solution

区间加区间 gcd ⁡ \gcd gcd 不太好做,考虑转化成单点加.
首先要知道一条性质: gcd ⁡ ( x , y ) = gcd ⁡ ( x , y − x ) \gcd(x,y)=\gcd(x,y-x) gcd(x,y)=gcd(x,yx).
那么就可以推式子了:
g c d ( a l , a l + 1 , ⋯ , a r ) = g c d ( a l , a l + 1 − a l , a l + 1 , a l + 2 − a l + 1 , ⋯ , a r , a r − a r − 1 ) = g c d ( a l , a l + 1 − a l , a l + 2 − a l + 1 , ⋯ , a r − a r − 1 ) \begin{aligned} &\quad\; gcd(a_l,a_{l+1},\cdots,a_r)\\ &=gcd(a_l,a_{l+1}-a_l,a_{l+1},a_{l+2}-a_{l+1},\cdots,a_r,a_r-a_{r-1})\\ &=gcd(a_l,a_{l+1}-a_l,a_{l+2}-a_{l+1},\cdots,a_r-a_{r-1}) \end{aligned} gcd(al,al+1,,ar)=gcd(al,al+1al,al+1,al+2al+1,,ar,arar1)=gcd(al,al+1al,al+2al+1,,arar1)
发现这就是差分,所以把差分数组拿到线段树上维护,就只需要单点加了.
用树状数组维护一下 a l a_l al 即可,注意答案要 abs.

Code

2.96 KB , 686 ms , 42.48 MB (in total, C++20 with O2) 2.96\text{KB},686\text{ms},42.48\text{MB}\;\texttt{(in total, C++20 with O2)} 2.96KB,686ms,42.48MB(in total, C++20 with O2)

#include <bits/stdc++.h>
using namespace std;using i64 = long long;
using ui64 = unsigned long long;
using i128 = __int128;
using ui128 = unsigned __int128;
using f4 = float;
using f8 = double;
using f16 = long double;template<class T>
bool chmax(T &a, const T &b){if(a < b){ a = b; return true; }return false;
}template<class T>
bool chmin(T &a, const T &b){if(a > b){ a = b; return true; }return false;
}int lowbit(int x){return x & -x;
}template<class T>
struct fenwick{int n;vector<T> c;fenwick() {}fenwick(int _n): n(_n){c.resize(n + 1);}fenwick(const vector<T> &a): n(a.size()){c.resize(n + 1);for(int i = 1; i <= n; i++){c[i] = c[i] + a[i - 1];int j = i + lowbit(i);if(j <= n) c[j] = c[j] + c[i];}}void add(int x, const T& v){for(int i = x + 1; i <= n; i += lowbit(i)) c[i] = c[i] + v;}T ask(int x){T ans{};for(int i = x + 1; i; i -= lowbit(i)) ans = ans + c[i];return ans;}T ask(int l, int r){return ask(r) - ask(l - 1);}
};namespace seg_tree {inline int ls(int u) { return 2 * u + 1; }inline int rs(int u) { return 2 * u + 2; }struct Node {int l, r;i64 val;};struct SegTree {vector<Node> tr;inline SegTree() {}inline SegTree(const vector<i64>& a) {const int n = a.size();tr.resize(n << 2);build(0, 0, n - 1, a);}inline void pushup(int u) {tr[u].val = ::gcd(tr[ls(u)].val, tr[rs(u)].val);}inline void build(int u, int l, int r, const vector<i64>& a) {tr[u].l = l, tr[u].r = r;if (l == r) {tr[u].val = a[l];return;}const int mid = (l + r) >> 1;build(ls(u), l, mid, a);build(rs(u), mid + 1, r, a);pushup(u);}inline void add(int u, int p, i64 x) {if (tr[u].l == tr[u].r) {tr[u].val += x;return;}const int mid = (tr[u].l + tr[u].r) >> 1;if (p <= mid) add(ls(u), p, x);else add(rs(u), p, x);pushup(u);}inline i64 gcd(int u, int l, int r) {if (l <= tr[u].l && tr[u].r <= r) return llabs(tr[u].val);const int mid = (tr[u].l + tr[u].r) >> 1;i64 res = 0;if (l <= mid) res = ::gcd(res, gcd(ls(u), l, r));if (r > mid) res = ::gcd(res, gcd(rs(u), l, r));return llabs(res);}};
}
using seg_tree::SegTree;signed main() {ios::sync_with_stdio(0);cin.tie(0), cout.tie(0);int n, m;cin >> n >> m;vector<i64> a(n);for (int i = 0; i < n; i++) cin >> a[i];auto [fwk, sgt] = [&]() {vector<i64> b(n);adjacent_difference(a.begin(), a.end(), b.begin());return make_pair(fenwick<i64>(b), SegTree(b));}();auto query = [&](int l, int r) {return gcd(fwk.ask(l), (l < r ? sgt.gcd(0, l + 1, r) : 0LL));};auto add = [&](int l, int r, i64 v) {fwk.add(l, v), sgt.add(0, l, v);if (r + 1 < n) fwk.add(r + 1, -v), sgt.add(0, r + 1, -v);};for (int i = 0; i < m; i++) {char op; int l, r; i64 v;cin >> op >> l >> r, l--, r--;if (op == 'C') add(l, r, (cin >> v, v));else cout << query(l, r) << endl;}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/73590.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从声源定位(DOA)算法仿真到工程源码实现-第八节

一、概述 本节我们记录在respeaker core v2 开发板上部署一个完整的声源定位(DOA)系统&#xff0c;演示可以看第一节中的视频。整个模块可以分为三部分&#xff0c;第一部分为控制开发板上的LED灯显示&#xff0c;这样可以实时的测试算法的效果&#xff1b;第二部分为从ALSA上取…

在linux部署网站

在Linux部署网站&#xff0c;需要准备一个纯净的系统 一、系统环境准备 1.设置静态IP地址 ‌ 2.关闭默认防火墙 systemctl disable firewalld --now ‌ 3.配置SSH密钥登录 4.yum update -y && reboot # 更新系统内核 5.yum install -y wget curl unzip # 安装…

Java后端API限流秘籍:高并发的防护伞与实战指南

目录导航 📜 🛡️ 为什么需要API限流?🧠 主流限流算法大解析👩‍💻 阿里巴巴的限流实践📏 四大黄金定律🤼 限流策略组合拳🏆 限流场景实战💻 技术实现方案🌟 最佳实践分享📈 结语与展望📚 推荐阅读 1. 🛡️ 为什么需要API限流? 在高并发环境中,未…

OpenGL ES 2.0与OpenGL ES 3.1的区别

如果硬件支持且需要更高质量的图形效果&#xff0c;推荐3.1&#xff1b;如果兼容性和开发简便更重要&#xff0c;且效果需求不高&#xff0c;2.0更合适。不过现代车载系统可能越来越多支持3.x版本&#xff0c;所以可能倾向于使用3.1&#xff0c;但具体情况还需调查目标平台的硬…

k8s存储介绍(五)PV与PVC

在 Kubernetes&#xff08;k8s&#xff09;中&#xff0c;持久化存储&#xff08;Persistent Storage&#xff09;是一个非常重要的概念&#xff0c;因为 Pod 本身是无状态的&#xff0c;重启后会丢失数据。为了支持有状态应用&#xff0c;Kubernetes 提供了持久化存储的机制&a…

ORA-00600 [2662]

一、数据库启动报ORA-00600[2662] [oraclenode1 ora11g]$ sqlplus / as sysdbaSQL*Plus: Release 11.2.0.3.0 Production on Thu Dec 22 14:37:00 2011Copyright (c) 1982, 2011, Oracle. All rights reserved.Connected to an idle instance.SQL> startup ORACLE instanc…

WebSocket接入SSL证书

目录 碎碎念解决方法创建 HTTPS WebSocket 服务器创建系统服务启动服务 碎碎念 在访问网站时&#xff0c;使用 HTTPS 非常重要。HTTPS 协议不仅可以确保数据传输的安全性&#xff0c;还可以防止中间人攻击和数据篡改等安全问题。任何没有 SSL 证书的内容都可能会被拒绝访问。因…

c#在work线程中怎样更新UI控件

最近笔者调试修改项目&#xff0c;碰到了c#在work线程中怎样更新UI控件中的场景&#xff0c;简单总结了下&#xff0c;主要有两个方法&#xff1a; 方法1&#xff1a;通过System.Windows.Application.Current.Dispatcher.Invoke来更新UI控件 System.Windows.Application.Curre…

数据结构每日一题day3(顺序表)★★★★★

题目描述&#xff1a;顺序表L的元素递增有序排列&#xff0c;设计一个算法在插入元素x后保持该顺序表仍然递增有序排列,插入成功后返回插入元素所在位置,不成功返回-1 算法思想&#xff1a;在递增有序的顺序表中插入元素 x 并保持有序性&#xff0c;步骤如下&#xff1a; 合法…

MyBatis中mapper.xml 的sql映射规则

一、SQL 映射文件核心元素 MyBatis 映射文件的顶级元素&#xff08;按定义顺序&#xff09;&#xff1a; cache&#xff1a;命名空间的缓存配置。cache-ref&#xff1a;引用其他命名空间的缓存。resultMap&#xff1a;自定义结果集映射。sql&#xff1a;可重用的 SQL 片段。i…

【计算机网络】计算机网络协议、接口与服务全面解析——结合生活化案例与图文详解

协议、接口与服务 导读一、协议1.1 定义1.2 组成 二、接口三、服务3.1 定义3.2 服务与协议的区别3.3 分类3.3.1 面向连接服务于无连接服务3.3.2 可靠服务和不可靠服务3.3.3 有应答服务和无应答服务 结语 导读 大家好&#xff0c;很高兴又和大家见面啦&#xff01;&#xff01;…

Ubuntu服务器中Swapper如何与虚拟内存配合

在Ubuntu服务器中&#xff0c;Swapper和虚拟内存是操作系统中重要的概念&#xff0c;它们共同协作以提高系统的内存管理效率。当物理内存不足时&#xff0c;Swapper会帮助系统将不活跃的数据从内存转移到磁盘上的交换空间(Swap)&#xff0c;以释放内存给需要更多资源的进程。下…

SQL Server 中常见的数据类型及其详细解释、内存占用和适用场景

以下是 SQL Server 中常见的数据类型及其详细解释、内存占用和适用场景&#xff1a; 数据类型类别数据类型解释内存占用适用场景整数类型bigint用于存储范围较大的整数&#xff0c;范围是 -2^63 (-9,223,372,036,854,775,808) 到 2^63-1 (9,223,372,036,854,775,807)8 字节需要…

vue数字公式篇 Tinymce结合使用(二)

继上一篇的数字公式 &#xff0c; 这次的功能是将公式能插入编辑器以及修改 1、Tinymce 自定义 LateX 按钮&#xff0c;打开公式编辑器窗口 LateX.vue window.tinymce.init({...//基础配置这里我就不写了setup(ed) {//自定义 LateX 按钮ed.ui.registry.addButton(LateX, {text:…

python数据增强和转换

数据增强和转换 固定转换随机转换概率控制的转换 固定转换 边缘补充像素(Pad)尺寸变换(Resize)中心截取(CenterCrop)顶角及中心截取(FiveCrop)尺灰度变换(GrayScale) 概率控制的转换 随机垂直翻转(RandomVerticalFlip)随机应用(RandomApply) # -*- coding: utf-8 -*- fro…

Ubuntu下UEFI安全启动安装Nvdia驱动

简介 众所周知&#xff0c;Ubuntu默认使用Nouveau开源驱动&#xff0c;其性能受限&#xff0c;因此我们需要安装Nvidia专用驱动。 安装专用驱动的一般方法非常简单&#xff0c;只需要sudo ubuntu-drivers devices && sudo ubuntu-drivers autoinstall即可&#xff0c…

05_循环结构三目运算符

目录 一、双重for循环 练习 二、break关键字 三、continue 关键字 练习 四、三元运算 / 三目运算 一、双重for循环 外层循环 循环一次&#xff0c;&#xff0c;&#xff0c;内层循环 循环一圈&#xff01;&#xff01;&#xff01; 循环里嵌套循环&#xff1a; for(var…

数据结构初阶-二叉树链式

目录 1.概念与结构 2.二叉数链式的实现 2.1遍历规则 2.2申请内存空间 2.3手动构建一棵二叉树 2.4二叉树结点的个数 2.5二叉树叶子结点的个数 2.6二叉树第K层结点个数 2.7二叉树的高度 2.8二叉树中查找值为x的结点 2.9二叉树的销毁 3.层序遍历 3.1概念 3.2层序遍历…

鸿蒙HarmonyOS NEXT之无感监听

鸿蒙中存在一些无感监听&#xff0c;这些监听经过系统API封装使用很简单&#xff0c;但是对实际业务开发中有很重要&#xff0c;例如埋点业务、数据统计、行为上报、切面拦截等。 Navigation的页面切换 在鸿蒙中Navigation被用来作为路由栈进行页面跳转&#xff0c;如果你想知…

批量处理word里面表格的空白行

1&#xff0c;随便打开一个word文档。 2&#xff0c;按下Alt F11 VBA编辑器,在左侧的「工程资源管理器」窗口中找到Normal 项目,右键选择插入->模块。 弹出一下弹窗 3&#xff0c;输入一下代码 代码&#xff1a; Sub RemoveEmptyTableRows()Dim tbl As TableDim row As R…