輸入:
5 61 2 3 4 5
1 1 5
2 1 5
3 1 2 1
4 1 3 2
1 1 4
2 2 3
輸出:
思路:核心:線段樹
加法和求和省略不談了(線段樹基操,不會的話自己補一下~~
求平方和算個小套路吧:
假設區間每個元素加上x,求平方和
∑( ai + x)^2 == ∑(ai^2) +2 * x * ∑ai +區間長度 * (x^2) ,維護區間和即可,注意要先維護區間平方和再維護區間和,因為求區間平方和用到的區間和是修改前的區間和!
#include
#define ios std::ios_base::sync_with_stdio(false), std::cin.tie(0), std::cout.tie(0);
using
namespace std;
typedef
long
long ll;
const
int n=
10010
;int a[n]
;struct ty
tree[
4*n]
;void
pushup
(int p,
int l,
int r)
void
pushdown
(int p,
int l,
int r)
}void
bulid
(int p ,
int l ,
int r)
int mid=
(l + r)
>>1;
bulid(2
*p,l,mid)
;bulid(2
*p+1
,mid+
1,r)
;pushup
(p,l,r);}
void
change
(int p,
int l,
int r ,
int a,
int b,
int num)
if( tree[p]
.jia || tree[p]
.cheng!=1)
pushdown
(p,l,r)
;int mid =
(l+r)
>>1;
if( a <= mid )
change(2
*p, l,mid,a,b,num);if
( b > mid )
change(2
*p+1
, mid+
1, r,a,b,num)
;pushup
(p,l,r);}
void
cheng
(int p,
int l,
int r ,
int a,
int b,
int num)
if( tree[p]
.jia || tree[p]
.cheng!=1)
pushdown
(p,l,r)
;int mid =
(l+r)
>>1;
if( a <= mid )
cheng(2
*p, l,mid,a,b,num);if
( b > mid )
cheng(2
*p+1
, mid+
1, r,a,b,num)
;pushup
(p,l,r);}
ll findsum
(int p,
int l,
int r ,
int a ,
int b)
if( tree[p]
.jia || tree[p]
.cheng!=1)
pushdown
(p,l,r)
;int mid =
(l+r)
>>1;
ll res=0;
if( a <= mid )
if( b > mid )
return res;
}ll findping
(int p,
int l,
int r ,
int a ,
int b)
if( b > mid )
return res;
}int
main()
if( op ==4)
}}
NC14661 簡單的資料結構
因為要從隊頭隊尾插入刪除元素,可以用stl中的deque 雙端佇列 便於操作.這些是deque的一些基本操作 1.把x壓入後 前端 push back x push front x 2.訪問 不刪除 後 前端元素 back front 3.刪除後 前端元素 pop back pop front 4....
資料結構 資料結構緒論
資料結構是相互間存在一種或多種特定關係的資料元素的集合。程式設計 資料結構 演算法 資料結構是一門研究非數值計算的程式設計問題中的操作物件,以及他們之間的關係和操作等相關問題的學科。資料元素是組成資料的 有一定意義的基本單位,是計算機中通常作為整體處理,也被稱為記錄。乙個資料元素可以由若干個資料項組...
資料結構 資料結構演算法
分治法 對於乙個規模為n的問題,若該問題可以容易地解決 比如說規模n較小 則直接解決 否則將其分解為k個規模較小的子問題,這些子問題互相獨立且與原問題形式相同,遞迴地解這些子問題,然後將各子問題的解合併得到原問題的解。動態規劃法 這種演算法也用到了分治思想,它的做法是將問題例項分解為更小的 相似的子...