洛谷 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 ai?ai?+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} 1ai?1018
∣ 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,y?x).
那么就可以推式子了:
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+1??al?,al+1?,al+2??al+1?,?,ar?,ar??ar?1?)=gcd(al?,al+1??al?,al+2??al+1?,?,ar??ar?1?)?
發現這就是差分,所以把差分數組拿到線段樹上維護,就只需要單點加了.
用樹狀數組維護一下 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.pswp.cn/web/73590.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/73590.shtml
英文地址,請注明出處:http://en.pswp.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…