傳送門
題目描述:
乙個長度為 n
nn 的序列,一開始序列數的權值都是 0
00,有 m
mm 次操作
支援兩種操作:
1 11l
llrrrx
xx,給區間 [ l
ll , r
rr ] 內位置為 pos
pospo
s 的數加上 (po
s−l)
∗x
(pos-l)*x
(pos−l
)∗x000l
llr
rr,查詢區間 [ l
ll , r
rr ] 內的權值和
最終答案對 109
+7
10^9+7
109+
7 取模。
輸入格式:
第一行兩個數 n
nn,m
mm,表示序列長度和操作次數
接下來 m
mm 行,每行描述乙個操作,有如下兩種情況:
1 11l
llrrrx
xx,給區間 [ l
ll , r
rr ] 內位置為 pos
pospo
s 的數加上 (po
s−l)
∗x
(pos-l)*x
(pos−l
)∗x000l
llr
rr,查詢區間 [ l
ll , r
rr ] 內的權值和
輸出格式:
每乙個 0
00 操作輸出乙個整數模 109
+7
10^9+7
109+7
樣例資料:輸入
5 50 2 3
1 4 5 1
1 1 5 5
0 1 4
0 2 3 輸出
03015
【資料範圍】
對於 30
%30\%
30% 的資料 n,m
n,mn,
m ≤ 2000
2000
2000
對於 100
%100\%
100%
的資料,n,m
n,mn,
m ≤ 300000
300000
300000
保證讀入的都是非負整數,所有的 x
xx ≤ 10000
10000
1000
0相當於是區間加上乙個等差數列吧
除了維護區間和之外,我們還需要維護每個區間的等差數列的首項和公差
由於是等差數列,用線段樹很好合併,首項和公差就直接相加,和的話套公式求和就可以了
然後其他的就是線段樹基礎操作了
#include
#include
#include
#define n 300005
#define mod 1000000007
using
namespace std;
int n,m,l,r,x;
int sum[n<<2]
,begin[n<<2]
,num[n<<2]
;void
add(
int root,
int l,
int r,
int val,
int start)
void
pushdown
(int root,
int l,
int r,
int mid)
}void
modify
(int root,
int l,
int r,
int x,
int y,
int k)
int mid=
(l+r)
>>1;
pushdown
(root,l,r,mid);if
(x<=mid)
modify
(root<<
1,l,mid,x,y,k);if
(y>mid)
modify
(root<<1|
1,mid+
1,r,x,y,k)
; sum[root]
=(sum[root<<1]
+sum[root<<1|
1])%mod;
}int
query
(int root,
int l,
int r,
int x,
int y)
intmain()
fclose
(stdin);
fclose
(stdout);
return0;
}
COGS 2964 數列操作
傳送門 題目描述 給定長度均為 n nn 的數列 a,b a,ba,b,其中 b bb 數列為 1 11 n nn 的全排列,a aa 數列全為 000。你需要支援 q qq 次操作,操作分為 add addad d 和 que ry query quer y 兩種。其中 x x x 表示對 x x...
COGS2638 數列操作
給定乙個數列a,你需要支援的操作 區間and,區間or,詢問區間最大值 一行兩個整數n,m,表示數列長度和操作個數。接下來一行有n個整數,第i個數表示ai。接下來m行,每一行均為以下三種操作中的一種 1 l r val ai ai and val l i r 2 l r val ai ai or v...
cogs240 數列操作 線段樹
問題描述 假設有一列數 1 i n 支援如下兩種操作 1 將 ak 的值加 d k,d 是輸入的數 2 輸出 as as 1 at s,t 都是輸入的數,s t 根據操作要求進行正確操作並輸出結果。輸入格式 輸入檔案第一行乙個整數n 0 n 100000 第二行為 n 個整數,表示 的初始值。第三行...