題目:
如題,已知乙個數列,你需要進行下面三種操作:
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 38sample output1 5 4 2 3
2 1 4 1
3 2 5
1 2 4 2
2 3 5 5
3 1 4
172
#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 ...