題目鏈結
題目大意
假定有乙個無限長的數軸,數軸上每個座標上的數都是0。
現在,我們首先進行 n 次操作,每次操作將某一位置x上的數加c。
接下來,進行 m 次詢問,每個詢問包含兩個整數l和r,你需要求出在區間[l, r]之間的所有數的和。
−109≤x≤109 ,
1≤n,m≤105,
−109≤l≤r≤109,
−10000≤c≤10000
解題思路
參考鏈結
離散化的本質,是對映,將間隔很大的點,對映到相鄰的陣列元素中。減少對空間的需求,也減少計算量。
首先,可以先統計所有出現的座標(將無限長的陣列,離散化為有限的座標),記錄插入操作的插入值、記錄查詢操作的兩個區間,其次將所有出現的座標去重。接著處理插入操作,使用二分查詢找到相應的座標;然後,為了方便計算查詢操作的區間和,使用字首和進行預處理;最後,在字首和陣列上處理查詢操作。
#include
#include
#include
using
namespace std;
typedef pair<
int,
int> pii;
//1≤n,m≤10^5,將無限長的數軸對映為n個座標
const
int n =
300010
;int n, m;
int a[n]
, s[n]
;vector<
int> alls;
vector add, query;
//第乙個 >= x 的位置
intfind
(int x)
return r +1;
// 對映到1.2......n
}//會將所有重複的元素,放在後面,然後刪除就可以了
vector<
int>
::iterator unique
(vector<
int>
&a)int
main()
);alls.
push_back
(x);
}for
(int i =
0; i < m; i ++))
; alls.
push_back
(l);
alls.
push_back
(r);
}// alls 涉及了所有的下標
// 去重
sort
(alls.
begin()
, alls.
end())
;//h 刪除下標pos開始的n個字元
// unique(alls) 會將所有重複的數字放在最後
alls.
erase
(unique
(alls)
, alls.
end())
;// 處理插入
for(
auto item : add)
// 字首和
for(
int i =
1; i <= alls.
size()
; i ++
) s[i]
= s[i -1]
+ a[i]
;// 處理詢問
for(
auto item : query)
return0;
}
這裡涉及兩個模板
模板一 vector去重
//會將所有重複的元素,放在後面,然後刪除就可以了
vector<
int>
::iterator unique
(vector<
int>
&a)int
main()
模板二 二分查詢第乙個》= x的位置//第乙個 >= x 的位置
intfind
(int x)
// 返回的下標從1開始
return r +1;
// 對映到1.2......n
}
題目鏈結
題目大意
給定 n 個區間 [li,ri],要求合併所有有交集的區間。
注意如果在端點處相交,也算有交集。
輸出合併完成後的區間個數。
例如[1,3]和[2,6]可以合併為乙個區間[1,6]。
解題思路 模擬
顯然區間的端點非常關鍵。
按區間左端點排序後,可以設定start,end記錄上一次區間的左右端點。
如果上一次區間的右端點,比新的區間的左端點還要大,但小於右端點,此時,上一次區間與新的區間可以合併,合併後的新區間的兩個端點是:[old_start,new_end]。
如果上一次區間的右端點,比新的區間的兩個端點還要大,舊區間自然包含了新的區間,不需要合併。
如果上一次區間的右端點,比新的區間的左端點還要小,由於已經按區間左端點排序,則舊區間不會再進行合併,記錄區間即可。
#include
using
namespace std;
#define pb push_back
#define mp make_pair
typedef pair<
int,
int> pii;
vector ans,res;
intmain()
sort
(ans.
begin()
,ans.
end())
;int start =
-1e9
;int end =
-1e9
;for
(auto it : ans)
else
// end < it.second才更新,否則可以直接不用管(前乙個範圍》it當前的範圍)
}else
if(end < it.second)
}//處理最後的區間
if(end !=
-1e9
&& start !=
-1e9
) cout << res.
size()
<<
"\n"
;return0;
}
AcWing 演算法基礎課 動態規劃
1 揹包問題 1 01揹包 每件物品僅用一次 可以做空間優化 dp j max dp j dp j v i w i 0,1揹包狀態均是從前一迴圈的狀態轉移 2 完全揹包 每件物品可以用無限次 完全揹包的狀態可以從當前迴圈的狀態轉移,進行優化 3 多重揹包 每件物品有不同的數量限制 可以對物品的數量限...
Acwing 基礎課 基礎演算法 歸併排序
參考鏈結 include const int n 100005 int a n int t n voidms int l,int r while i mid t k a i while j r t k a j for int i l i r i intmain 題目鏈結 參考鏈結 題目大意 給定乙個...
Acwing演算法基礎課知識點
知識點 基礎演算法 模板鏈結常用 模板1 基礎演算法 排序 二分高精度 字首和與差分 雙指標演算法 位運算離散化 區間合併 資料結構 模板鏈結常用 模板2 資料結構 鍊錶與鄰接表 樹與圖的儲存 棧與佇列 單調佇列 單調棧 kmptrie 並查集堆 hash表 c stl使用技巧 搜尋與圖論 模板鏈結...