放**注意點:!!!!
注意運算子優先順序
比如:a*=b%p 是b先mod p再與a相乘
a<<1+1是1+1再a位移
a<<1=a*2
a<<1|1=a*2+1
參見:
/*******************************線段樹v2.0
支援區間加、區間乘、區間和查詢
********************************/
#include#include#include#define n 1000010
using namespace std;
struct node
} tree[n];
long long a[n];
int n,m,p;//n:區間大小 m:操作次數 p:取模
//left:當前區間左端 right:當前區間右端 node:當前節點
void build_tree(int left,int right,int node)
}//標記下放 node:當前節點
void push_down(int node)
//上推 node:當前節點
void push_up(int node)
//區間加操作 left:操作區間左端點 right:操作區間右端點 node:當前節點 value:操作值
void add_range(int left,int right,int node,long long value)
push_down(node);
int mid=(tree[node].left+tree[node].right)>>1;
if(left<=mid) add_range(left,right,node<<1,value);
if(right>mid) add_range(left,right,node<<1|1,value);
push_up(node);
}//區間乘操作 left:操作區間左端點 right:操作區間右端點 node:當前節點 value:操作值
void mult_range(int left,int right,int node,long long value)
push_down(node);
int mid=(tree[node].left+tree[node].right)>>1;
if(left<=mid) mult_range(left,right,node<<1,value);
if(right>mid) mult_range(left,right,node<<1|1,value);
push_up(node);
}//區間和查詢 left:查詢區間左端點 right:查詢區間右端點 node:當前節點
long long query_sum(int left,int right,int node)
int main()
if(c==2)//區間加操作
if(c==3)//查詢
cout<} return 0;
}
線段樹二(區間修改)
概述 區間修改即將乙個區間內所有值改為乙個值 或加上乙個值 為了執行快速,我們通常用 懶 標記維護整個區間值的情況,在需要是再將這個 懶 標記傳到該節點的兩個子節點上。模版 此為在整個區間上加上乙個值 洛谷p3372 include include include include include i...
線段樹(二) 區間修改
上一節介紹了點修改與區間查詢的線段樹,事實上,線段樹還可以做得更多。本節討論區間修改問題。給出乙個 n 個元素的陣列 a 1,a 2,a n 你的任務是設計乙個資料結構,支援以下兩種操作 點修改只會影響到 logn 個結點,但區間修改在最壞情況下會影響到樹中的所有結點,比如,如果對整個區間執行 ad...
線段樹 區間加乘區間最大
如題,已知乙個數列,你需要進行下面兩種操作 1.將某區間每乙個數加上x 2.將某區間每乙個數乘上x 3.求出某區間每乙個數的和 第一行包含三個整數n m p,分別表示該數列數字的個數 操作的總個數和模數。第二行包含n個用空格分隔的整數,其中第i個數字表示數列第i項的初始值。接下來m行每行包含3或4個...