gfoj 區間更新模板

2021-08-31 09:37:33 字數 2498 閱讀 9547

題目:

如題,已知乙個數列,你需要進行下面三種操作:

1.將某區間每乙個數乘上x

2.將某區間每乙個數加上x

3.求出某區間每乙個數的和

input

第一行包含三個整數n、m、p,分別表示該數列數字的個數、操作的總個數和模數。

第二行包含n個用空格分隔的整數,其中第i個數字表示數列第i項的初始值。

接下來m行每行包含3或4個整數,表示乙個操作,具體如下:

操作1: 格式:1 x y k 含義:將區間[x,y]內每個數乘上k

操作2: 格式:2 x y k 含義:將區間[x,y]內每個數加上k

操作3: 格式:3 x y 含義:輸出區間[x,y]內每個數的和對p取模所得的結果

output

輸出包含若干行整數,即為所有操作3的結果。

時空限制:1000ms,128m

資料規模:

對於30%的資料:n<=8,m<=10

對於70%的資料:n<=1000,m<=10000

對於100%的資料:n<=100000,m<=100000

sample input

5 5 38

1 5 4 2 3

2 1 4 1

3 2 5

1 2 4 2

2 3 5 5

3 1 4

sample output

17

2

#include #include #include using namespace std;

struct node

;const int maxs=100000;

node m[maxs*4+5];

long long a[maxs+5];

int n,m,p;

void pushup(int x)

void pushdown(int x)

else if (m[x].mul!=1) }

void build(int x,int l,int r)

build(2*x,l,mid);

build(2*x+1,mid+1,r);

pushup(x);

}void add(int x,int l,int r,int k)

pushdown(x);

if (r<=mid)

add(2*x,l,r,k);

else if (l>mid)

add(2*x+1,l,r,k);

else

pushup(x);

}void mul(int x,int l,int r,int k)

pushdown(x);

if (r<=mid)

mul(2*x,l,r,k);

else if (l>mid)

mul(2*x+1,l,r,k);

else

pushup(x);

}long long query(int x,int l,int r)

int main()

else if (t1==2)

else

}return 0;

}

//定義先乘後加

#include #include #include using namespace std;

struct node

;const int maxs=100000;

node m[maxs*4+5];

long long a[maxs+5];

long long n,m,p;

void pushup(int x)

void pushdown(int x)//先加後乘

if (m[x].add!=0) }

void build(int x,int l,int r)

build(2*x,l,mid);

build(2*x+1,mid+1,r);

pushup(x);

}void add(int x,int l,int r,int k)

pushdown(x);

if (r<=mid)

add(2*x,l,r,k);

else if (l>mid)

add(2*x+1,l,r,k);

else

pushup(x);

}void mul(int x,int l,int r,int k)

pushdown(x);

if (r<=mid)

mul(2*x,l,r,k);

else if (l>mid)

mul(2*x+1,l,r,k);

else

pushup(x);

}long long query(int x,int l,int r)

int main()

else if (t1==2)

else

}return 0;

}

線段樹 學習 模板 單點更新 區間更新

線段樹是幹什麼的?有一列數,每次可以進行以下三種操作中的一種 1 給指定區間中的每個數都加上某個值 2 將指定區間內的所有數置成某乙個統一的值 3 詢問乙個區間上的最小值 最大值 所有數的和。樸素做法怎麼做?用線性表儲存,每種操作,對待處理或待詢問區間中的每個元素都逐一進行處理。複雜度多少?假設這個...

區間dp模板

板子題 n堆石子擺成一條線。現要將石子有次序地合併成一堆。規定每次只能選相鄰的2堆石子合併成新的一堆,並將新的一堆石子數記為該次合併的代價。計算將n堆石子合併成一堆的最小代價。例如 1 2 3 4,有不少合併方法 1 2 3 4 3 3 4 3 6 4 9 10 19 1 2 3 4 1 5 4 5...

區間修改 區間查詢模板

如題,已知乙個數列,你需要進行下面兩種操作 1.將某區間每乙個數加上x 2.求出某區間每乙個數的和 第一行包含兩個整數n m,分別表示該數列數字的個數和操作的總個數。第二行包含n個用空格分隔的整數,其中第i個數字表示數列第i項的初始值。接下來m行每行包含3或4個整數,表示乙個操作,具體如下 操作1 ...