P1438 無聊的數列/P1253 扶蘇的問題

因為這兩天在寫線性代數的作業,沒怎么寫題……

P1438 無聊的數列

題目背景

無聊的 YYB 總喜歡搞出一些正常人無法搞出的東西。有一天,無聊的 YYB 想出了一道無聊的題:無聊的數列。。。

題目描述

維護一個數列?ai?,支持兩種操作:

  • 1 l r K D:給出一個長度等于?r?l+1?的等差數列,首項為?K,公差為?D,并將它對應加到?[l,r]?范圍中的每一個數上。即:令?al?=al?+K,al+1?=al+1?+K+D…ar?=ar?+K+(r?l)×D。

  • 2 p:詢問序列的第?p?個數的值?ap?。

輸入格式

第一行兩個整數數?n,m?表示數列長度和操作個數。

第二行?n?個整數,第?i?個數表示?ai?。

接下來的?m?行,每行先輸入一個整數?opt。

若?opt=1?則再輸入四個整數?l?r?K?D;

若?opt=2?則再輸入一個整數?p。

輸出格式

對于每個詢問,一行一個整數表示答案。

輸入輸出樣例

輸入 #1復制

5 2
1 2 3 4 5
1 2 4 1 2
2 3

輸出 #1復制

6

說明/提示

數據規模與約定

對于?100%?數據,0≤n,m≤105,?200≤ai?,K,D≤200,1≤l≤r≤n,1≤p≤n。

思路:

最要注意的是他的結果會超過int型,所以要用 long long 來記錄結果

  1. 等差數列的分解

    • 等差數列可以分解為常數項和線性項:

      • 常數項:A = K - l × D

      • 線性項系數:D

    • 位置 i 的增加值:add(i) = (K - l × D) + (i - l) × D = A + D × i

  2. 兩個樹狀數組維護

    • 樹狀數組 tr1:維護常數項(A)

      • 在 l 處加 A

      • 在 r+1 處減 A(若 r+1 ≤ n)

    • 樹狀數組 tr2:維護線性項系數(D)

      • 在 l 處加 D

      • 在 r+1 處減 D(若 r+1 ≤ n)

  3. 查詢計算

    • 位置 p 的值 = 初始值 + tr1 的前綴和(p) + tr2 的前綴和(p) × p

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
struct ss {long long k, d;int l, r;
}a[400005];
int  b[100005];
void XiaFang(int i) {a[i * 2].k += a[i].k;a[i * 2].d += a[i].d;a[i * 2 + 1].k += a[i].k + (a[i * 2 + 1].l - a[i].l) * a[i].d;a[i * 2 + 1].d += a[i].d;a[i].k = 0;a[i].d = 0;
}
void Chu(int l, int r, int i) {a[i].l = l, a[i].r = r, a[i].d = 0;if (l == r) {a[i].k = b[a[i].l];return;}a[i].k = 0;int mid = (l + r) >> 1;Chu(l, mid, i * 2);Chu(mid + 1, r, i * 2 + 1);
}
void ChaRu(int l, int r, int k, int d,int i) {if (a[i].l >= l && a[i].r <= r) {a[i].k += k + (a[i].l - l) * d;a[i].d += d;return;}int mid = (a[i].l + a[i].r) >> 1;if (a[i].d != 0 || a[i].k != 0) {XiaFang(i);}if (l<=mid ) {ChaRu(l, r, k, d, i * 2);}if (mid+1 <= r) {ChaRu(l, r, k, d, i * 2 + 1);}
}
long long Cha(int p, int i) {if (a[i].l == p&&a[i].r==p) {return a[i].k;}int mid = (a[i].l + a[i].r) >> 1;if (a[i].d != 0 || a[i].k != 0) {XiaFang(i);}if ( p<=mid ) {return Cha(p, i * 2);}else {return Cha(p, i * 2 + 1);}
}
int p, l, r, k, d, n, m, q;
int main(){ios::sync_with_stdio(false);        // 禁用同步cin.tie(nullptr);                   // 解除cin與cout綁定cin >> n >> m;for (int i = 1; i <= n; i++) {cin >> b[i];}Chu(1,n,1);for (int i = 0; i < m; i++) {cin >> q;if (q == 1) {cin >> l >> r >> k >> d;ChaRu(l, r, k, d, 1);}else {cin >> p;cout << Cha(p, 1) << endl;}}return 0;
}

?P1253 扶蘇的問題

題目描述

給定一個長度為?n?的序列?a,要求支持如下三個操作:

  1. 給定區間?[l,r],將區間內每個數都修改為?x。
  2. 給定區間?[l,r],將區間內每個數都加上?x。
  3. 給定區間?[l,r],求區間內的最大值。

輸入格式

第一行是兩個整數,依次表示序列的長度?n?和操作的個數?q。
第二行有?n?個整數,第?i?個整數表示序列中的第?i?個數?ai?。
接下來?q?行,每行表示一個操作。每行首先有一個整數?op,表示操作的類型。

  • 若?op=1,則接下來有三個整數?l,r,x,表示將區間?[l,r]?內的每個數都修改為?x。
  • 若?op=2,則接下來有三個整數?l,r,x,表示將區間?[l,r]?內的每個數都加上?x。
  • 若?op=3,則接下來有兩個整數?l,r,表示查詢區間?[l,r]?內的最大值。

輸出格式

對于每個?op=3?的操作,輸出一行一個整數表示答案。

輸入輸出樣例

輸入 #1復制

6 6
1 1 4 5 1 4
1 1 2 6
2 3 4 2
3 1 4
3 2 3
1 1 6 -1
3 1 6

輸出 #1復制

7
6
-1

輸入 #2復制

4 4
10 4 -3 -7
1 1 3 0
2 3 4 -4
1 2 4 -9
3 1 4

輸出 #2復制

0

說明/提示

數據規模與約定

  • 對于?10%?的數據,n=q=1。
  • 對于?40%?的數據,n,q≤103。
  • 對于?50%?的數據,0≤ai?,x≤104。
  • 對于?60%?的數據,op=1。
  • 對于?90%?的數據,n,q≤105。
  • 對于?100%?的數據,1≤n,q≤106,1≤l,r≤n,op∈{1,2,3},∣ai?∣,∣x∣≤109。

提示

請注意大量數據讀入對程序效率造成的影響。

思路:

  1. 線段樹節點設計

    • 每個節點包含三個字段:setv(區間賦值標記)、addv(區間加法標記)和?maxv(區間最大值)。

    • setv?為?LLONG_MIN?時表示該節點沒有賦值標記。

    • addv?為 0 時表示沒有加法標記。

  2. 標記下傳)

    • 如果當前節點有賦值標記(setv != LLONG_MIN),則將其下傳到子節點,并清除子節點的加法標記。

    • 如果當前節點有加法標記(addv != 0),則根據子節點的標記類型進行更新:

      • 如果子節點有賦值標記,則將加法標記加到賦值標記上。

      • 否則,將加法標記加到子節點的加法標記上。

    • 更新子節點的最大值并清除當前節點的標記。

  3. 標記上傳

    • 用子節點的最大值更新當前節點的最大值。

  4. 區間賦值操作

    • 當節點區間完全被目標區間覆蓋時,設置節點的?setv?為指定值,清除?addv,并更新?maxv

    • 否則,下傳標記后遞歸處理子節點,最后更新當前節點的最大值。

  5. 區間加法操作

    • 當節點區間完全被目標區間覆蓋時:

      • 如果有賦值標記,則更新賦值標記。

      • 否則,更新加法標記。

    • 更新節點的最大值。

    • 否則,下傳標記后遞歸處理子節點,最后更新當前節點的最大值。

  6. 區間最大值查詢

    • 當節點區間完全被查詢區間覆蓋時,直接返回?maxv

    • 否則,下傳標記后遞歸查詢子節點,并返回子節點中的最大值。

然后就是他這個題目的結構體還是有一點說法 的,如果你把x放進去記錄那比較好些一點,但你一開始向我一樣懶的話就只能在op1下滑時a[i * 2+1].Max0 = a[i].Max0-a[i].op2;(先op1在op2)

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
struct ss {int l, r;long long Max0;long long op2;bool op1;
}a[4000006];
long long b[1000006];
void Chu(int l, int r, int i) {a[i].l = l, a[i].r = r;a[i].op2 = 0, a[i].op1 = false;if (l == r) {a[i].Max0 = b[l];return;}int mid = (l + r) >> 1;Chu(l, mid, i * 2);Chu(mid + 1, r, i * 2 + 1);a[i].Max0 = max(a[i * 2].Max0, a[i * 2 + 1].Max0);
}
void OOp1(int i) {if(a[i].l!=a[i].r) {a[i * 2].Max0 = a[i].Max0-a[i].op2;a[i * 2].op2 = 0;a[i * 2].op1 = true;a[i * 2+1].Max0 = a[i].Max0-a[i].op2;a[i * 2+1].op2 = 0;a[i * 2+1].op1 = true;}a[i].op1 = false;
}
void OOp2(int i) {if (a[i].l != a[i].r) {a[i * 2].Max0 += a[i].op2;a[i * 2].op2 += a[i].op2;a[i * 2 + 1].Max0 += a[i].op2;a[i * 2 + 1].op2 += a[i].op2;}a[i].op2 = 0;
}
void Op1(int l, int r, long long x,int i) {if (a[i].l >= l && a[i].r <= r) {a[i].Max0 = x;a[i].op2 = 0;a[i].op1 = true;return;}if (a[i].op1) {OOp1(i);}if (a[i].op2 != 0) {//可能為負數OOp2(i);}int mid = (a[i].l + a[i].r) >> 1;if (l <= mid) {Op1(l, r,x, i * 2);}if (mid + 1 <= r) {Op1(l, r, x, i * 2 + 1);}a[i].Max0 = max(a[i * 2].Max0, a[i * 2 + 1].Max0);
}
void Op2(int l, int r, long long x, int i) {if (a[i].l >= l && a[i].r <= r) {a[i].Max0 += x;a[i].op2 += x;return;}if (a[i].op1) {OOp1(i);}if (a[i].op2 != 0) {//可能為負數OOp2(i);}int mid = (a[i].l + a[i].r) >> 1;if (l <= mid) {Op2(l, r, x, i * 2);}if (mid + 1 <= r) {Op2(l, r, x, i * 2 + 1);}a[i].Max0 = max(a[i * 2].Max0, a[i * 2 + 1].Max0);
}
long long Op3(int l, int r, int i) {if (a[i].l >= l && a[i].r <= r) {return a[i].Max0;}if (a[i].op1) {OOp1(i);}if (a[i].op2 != 0) {//可能為負數OOp2(i);}int mid = (a[i].l + a[i].r) >> 1;long long w = LLONG_MIN;if (l <= mid) {w = max(w, Op3(l, r, i * 2));}if (mid + 1 <= r) {w = max(w, Op3(l, r, i * 2 + 1));}return w;
}
int n, m, l, r, op;
long long x;
int main(){ios::sync_with_stdio(false);        // 禁用同步cin.tie(nullptr);                   // 解除cin與cout綁定cin >> n >> m;for (int i = 1; i <= n; i++) {cin >> b[i];}Chu(1, n, 1);for (int i = 1; i <= m; i++) {cin >> op;switch (op){case 1:cin >> l >> r >> x;Op1(l, r, x, 1);break;case 2:cin >> l >> r >> x;Op2(l, r, x, 1);break;case 3:cin >> l >> r;cout << Op3(l, r, 1) << endl;break;default:break;}}return 0;
}

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/907995.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/907995.shtml
英文地址,請注明出處:http://en.pswp.cn/news/907995.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SpringBoot 自定義注解實現限流

SpringBoot 自定義注解實現限流 限流是為了防止服務器資源的過度消耗&#xff0c;通過一定的策略來控制訪問頻率&#xff0c;確保服務的高可用性和穩定性。其核心意義在于防止流量高峰時期接口過載&#xff0c;從而引起服務崩潰或響應延遲增加。本文將簡述如何通過AOP和自定義…

Unity——QFramework框架 內置工具

QFramework 除了提供了一套架構之外&#xff0c;QFramework 還提供了可以脫離架構使用的工具 TypeEventSystem、EasyEvent、BindableProperty、IOCContainer。 這些工具并不是有意提供&#xff0c;而是 QFramework 的架構在設計之初是通過這幾個工具組合使用而成的。 內置工具…

Vue3.5 企業級管理系統實戰(二十二):動態菜單

在前幾篇內容中已完成菜單、角色及菜單權限等相關開發&#xff0c;若要在左側菜單根據用戶角色動態展示菜單&#xff0c;需對 Sidebar 中的相關數據進行修改。鑒于其他相關方法及類型已在前文實現&#xff0c;本文不再重復闡述。 1 修改 Sidebar 組件 在 src/layout/componen…

014校園管理系統技術解析:構建智慧校園管理平臺

校園管理系統技術解析&#xff1a;構建智慧校園管理平臺 在教育信息化快速發展的當下&#xff0c;校園管理系統成為提升學校管理效率、優化校園服務的重要工具。該系統集成院校管理、投票管理等多個核心模塊&#xff0c;面向管理員、用戶和院內管理員三種角色&#xff0c;通過…

創新農業社會化服務 中和農信服務小農戶的探索實踐

在實現鄉村振興的道路上&#xff0c;如何讓現代農業發展成果惠及廣大小農戶&#xff0c;是一個重要課題。作為國內領先的綜合助農機構&#xff0c;中和農信多年來深耕農村市場&#xff0c;在服務小農戶方面進行了諸多創新探索&#xff0c;走出了一條具有示范意義的農業社會化服…

6.3 day 35

知識點回顧&#xff1a; 三種不同的模型可視化方法&#xff1a;推薦torchinfo打印summary權重分布可視化進度條功能&#xff1a;手動和自動寫法&#xff0c;讓打印結果更加美觀推理的寫法&#xff1a;評估模式 可視化 理解深度學習網絡最重要的2點&#xff1a; 1.了解損失如何定…

【如何在IntelliJ IDEA中新建Spring Boot項目(基于JDK 21 + Maven)】

AA. 我的開發環境配置與核心工具鏈解析 一、開發環境全覽 C:\Users\Again>java -version java version "21.0.1" 2023-10-17 LTS Java(TM) SE Runtime Environment (build 21.0.112-LTS-29) Java HotSpot(TM) 64-Bit Server VM (build 21.0.112-LTS-29, mixed m…

【C++高級主題】多重繼承下的類作用域

目錄 一、類作用域與名字查找規則&#xff1a;理解二義性的根源 1.1 類作用域的基本概念 1.2 單繼承的名字查找流程 1.3 多重繼承的名字查找特殊性 1.4 關鍵規則&#xff1a;“最近” 作用域優先&#xff0c;但多重繼承無 “最近” 二、多重繼承二義性的典型類型與代碼示…

登錄vmware vcenter報vSphere Client service has stopped working錯誤

一、問題 登錄vmware vcenter時發現報vSphere Client service has stopped working錯誤&#xff0c;導致vcenter控制臺進不去 二、解決辦法 打開vmware vcenter管理https://vcenterIP:5480&#xff0c;選擇VMware vSphere Client&#xff0c;重啟該服務后恢復正常。

MySQL關系型數據庫學習

學習參考鏈接&#xff1a;https://www.runoob.com/mysql/mysql-tutorial.html Windows 安裝MYSQL服務端的步驟&#xff1a;https://www.runoob.com/w3cnote/windows10-mysql-installer.html 1. 概念學習 MySQL 是一種關聯數據庫管理系統&#xff0c;關聯數據庫將數據保存在不…

web攻防之SSTI 注入漏洞

知識簡介 &#xff1a; 模版引擎和框架的區別 ssti的中文翻譯 &#xff1a; 服務端的模版的注入 模版引擎 &#xff1a;前端的用于裝飾優化html的模版 最簡單的就是在騰訊會議中的聊天功能 框架 &#xff1a; 這個是一套獨立存在的邏輯 如TP他是一個區別于php語法的后端邏輯…

【清晰教程】利用Git工具將本地項目push上傳至GitHub倉庫中

Git 是一個分布式版本控制系統&#xff0c;由 Linus Torvalds 創建&#xff0c;用于有效、高速地處理從小到大的項目版本管理。GitHub 是一個基于 Git 的代碼托管平臺&#xff0c;提供了額外的協作和社交功能&#xff0c;使項目管理更加高效。它們為項目代碼管理、團隊協作和持…

極簡以太彩光網絡解決方案4.0正式發布,“彩光”重構園區網絡極簡之道

5月28日下午,銳捷網絡在京舉辦以“光,本該如此‘簡單’”為主題的發布會,正式發布極簡以太彩光網絡解決方案4.0。作為“彩光”方案的全新進化版本,極簡以太彩光4.0從用戶需求出發,聚焦場景洞察,開啟了一場從底層基因出發的極簡革命,通過架構、部署、運維等多維度的創新升級,以強…

Selenium 中 JavaScript 點擊的優勢及使用場景

*在 Selenium 自動化測試中&#xff0c;使用 JavaScript 執行點擊操作&#xff08;如driver.execute_script("arguments[0].click();", element)&#xff09;相比直接調用element.click()有以下幾個主要優勢&#xff1a; 1. 繞過元素不可點擊的限制 問題場景&#x…

CppCon 2014 學習:Cross platform GUID association with types

類型的 GUID&#xff08;全局唯一標識符&#xff09; 是在 COM 編程&#xff08;Component Object Model&#xff09; 和某些大型 C 架構&#xff08;如 Office、DirectX、跨 DLL 接口&#xff09;中關聯類型信息和實現運行時類型識別與動態接口查詢的重要機制。 下面我們分層解…

Android 11以上App主動連接WIFI的完整方案

早期Android版本App內連接指定的WIFI還是比較簡單的&#xff0c;但是隨著Android版本的提升&#xff0c;限制也越來越多。以下是一套完整的Android 11以上的WIFI應用內主動連接方案。 第一步&#xff1a;添加到建議連接&#xff1a; val wifiManager getSystemService(WIFI_…

讓AI彈琴作曲不再是夢:Python+深度學習玩轉自動化音樂創作

讓AI彈琴作曲不再是夢:Python+深度學習玩轉自動化音樂創作 一、AI也能譜出動人的旋律?真不是科幻! 還記得小時候學鋼琴時老師的那句經典:“感覺不到情緒的樂句,是沒靈魂的。” 當時我一邊練琴一邊想:要是有個機器能幫我寫譜、調性又不跑調就好了! 結果幾年后,真被我碰…

機器學習:集成學習概念、分類、隨機森林

本文目錄&#xff1a; 一、集成學習概念**核心思想&#xff1a;** 二、集成學習分類&#xff08;一&#xff09;Bagging集成&#xff08;二&#xff09;Boosting集成(三&#xff09;兩種集成方法對比 三、隨機森林 一、集成學習概念 集成學習是一種通過結合多個基學習器&#…

YOLO機械臂丨使用unity搭建仿真環境,YOLO算法識別,Moveit2控制

文章目錄 前言搭建開發環境在window中安裝Unity創建Docker容器&#xff0c;并安裝相關軟件運行測試改進添加刪除節點前的函數調用 報錯?框選節點的時候報錯?如果無法控制機械臂&#xff0c;查看rviz2的終端&#xff0c;應該會有?規劃路徑超出范圍 參考 前言 本項目介紹通過…

Docker 插件生態:從網絡插件到存儲插件的擴展能力解析

Docker 容器技術以其輕量、快速、可移植的特性,迅速成為構建和部署現代應用的核心工具。然而,盡管 Docker Engine 自身功能強大,但在面對多樣化的生產環境和復雜業務需求時,僅靠核心功能往往無法滿足所有場景。 例如,跨主機的容器網絡通信、異構存儲系統的持久化數據管理…