線段樹 二 區間乘 區間加

2022-05-07 19:27:06 字數 1538 閱讀 9366

放**注意點:!!!!

注意運算子優先順序

比如: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個...