數列分塊入門 1 LibreOJ 6277

2022-08-17 16:21:14 字數 1805 閱讀 4485

有趣的分塊理論講解

給出乙個長為 n

'>n

n 的數列,以及 n

'>n

n 個操作,操作涉及區間加法,單點查值。

input

第一行輸入乙個數字 n

'>n

n。第二行輸入 n

'>n

n 個數字,第 i

'>i

i 個數字為 a

i'>ai

ai,以空格隔開。

接下來輸入 n

'>n

n 行詢問,每行輸入四個數字 opt

'>opt

opt、l

'>l

l、r'>r

r、c'>c

c,以空格隔開。

若 opt=

0'>opt=0

opt=0,表示將位於 [l,

r]'>[l,r]

[l,r] 的之間的數字都加 c

'>c

c。若 opt

=1'>opt=1

opt=1,表示詢問 a

r'>ar

ar 的值(l

'>l

l 和 c

'>c

c 忽略)。

output

對於每次詢問,輸出一行乙個數字表示答案。

example

樣例輸入

4

1 2 2 3

0 1 3 1

1 0 1 0

0 1 2 2

1 0 2 0

樣例輸出
2

5

1 #include 2 #include 3 #include 4 #include 

5 #include 6 #include 7 #include

8 #include 9 #include 10 #include 11 #include 12 #include 13 #include 14 #include 15 #include 16

#define ull unsigned long long

17#define ll long long

18#define pb push_back

19#define rep(i,start,end) for(int i=start;i<=end;i++)

20#define per(i,end,start) for(int i=end;i>=start;i--)

21#define tle ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);

22#define lc now<<1

23#define rc now<<1|1

24ll read()

2528

while(ch>='

0'&&ch<='9')

29return x*f;30}

31using

namespace

std;

32const

int mod = 1000000007 ; ///

998244353;

33const

int mxn = 2e5 +7;34

ll _,n,m,t,k,u,v,ans,cnt,ok,lim,len;

35int

a[mxn] ,inv[mxn],lazy[mxn],id[mxn];

36void up(int l,int r,int

c)37

44int

main()

4557 }

題解 LibreOJ6277 數列分塊入門 1

更好的閱讀體驗 portal1 libreoj 給出乙個長為 n 的數列,以及 n 個操作,操作涉及區間加法,單點查值。第一行輸入乙個數字 n 第二行輸入 n 個數字,第 i 個數字為 a i 以空格隔開。接下來輸入 n 行詢問,每行輸入四個數字 opt l r c 以空格隔開。若 texttt 表...

LibreOJ 6277 數列分塊入門 1 分塊

題解 感謝hzwer學長和loj讓本蒟蒻能夠找到如此合適的入門題做.這是一道非常標準的分塊模板題,本來用打標記的線段樹不知道要寫多少行,但是分塊只有這麼幾行,極其高妙.如下 include include include include include using namespace std int...

LibreOJ 6279 數列分塊入門 3

題意 給你乙個n nn個整數的序列a aa,讓你進行兩種操作 分析 這裡用分塊 與第二題相似,查詢前驅我們同樣需要排序,不過這裡可能會想到這樣的情況,即對於查詢x xx前驅,如果查詢區間內有多個x,這樣顯然直接二分是不行的,即我們需要去重,或者統計區間內每個元素的個數,這裡便用到了set setse...