洛谷P3373 線段樹2(補上注釋了)

2022-02-14 17:23:06 字數 1454 閱讀 6838

毒瘤題。找了一下午+晚上的bug,才發現原來query_tree寫的是a%p;

真的是乙個教訓

upd:2019.6.18

#include#include

#include

#include

#include

#define lson i*2,l,mid //這個是巨集定義,用前面的lson替代後面的i*2,l,mid

#define rson i*2+1,mid+1,r

using

namespace

std;

struct

treet[

400860

];int n,m,a[100860

],p;

void build_tree(int i,int l,int

r)int mid=(l+r)/2

;build_tree(lson);

build_tree(rson);

t[i].sum=(t[i*2].sum+t[i*2+1].sum)%p;

}void pushdown2(int

i) //回溯也有坑,大佬說兩個push_down可以合併,特別注意mul最後賦值為1,向下傳遞的時候不要忘了下面的add和mul

void pushdown(int

i)void mul_tree(int i,int l,int r,int x,int y,int

a)pushdown(i);

int mid=(l+r)/2

;if(x<=mid) mul_tree(lson,x,y,a);

if(y>mid) mul_tree(rson,x,y,a);

t[i].sum=(t[i*2].sum+t[i*2+1].sum)%p;

}void add_tree(int i,int l,int r,int x,int y,int

a)pushdown(i);

int mid=(l+r)/2

;if(x<=mid) add_tree(lson,x,y,a);

if(y>mid) add_tree(rson,x,y,a);

t[i].sum=(t[i*2].sum+t[i*2+1].sum)%p;

} int query_tree(int i,int l,int r,int a,int

b)int mid=(l+r)/2

;long

long ans=0

;pushdown(i);

if(a<=mid) ans+=query_tree(lson,a,b)%p;

if(b>mid) ans+=query_tree(rson,a,b)%p;

return ans%p;

}int

main()

if(k==2

)if(k==3)}

return0;

}

洛谷 P3373 線段樹 2

作為一道調了三天的模板題,真的太虐心了對於理解線段樹大有用處。傳送門如題,已知乙個數列,你需要進行下面三種操作 1.將某區間每乙個數乘上x 2.將某區間每乙個數加上x 3.求出某區間每乙個數的和 輸入格式 第一行包含三個整數n m p,分別表示該數列數字的個數 操作的總個數和模數。第二行包含n個用空...

線段樹2 洛谷p3373 線段樹

題目位址 解釋 多了乙個乘法操作,可以考慮優先順序。每次先算乘法。首先,對於乙個區間 和為s 假設已經按 a 乘b進行了操作。值得到的值為 s a b sb ab 假設先乘得到 sb a 這樣相比,add應該還要再乘上乙個b才對,所以,當更新到乙個區間時,為了進行先乘的操作而不讓結果發生變化,應該將...

洛谷P3373 模板 線段樹2

這題有毒啊,敲了我一晚上加一早上,總算a了。由於有加和乘兩個操作,要用2個lazy陣列。核心難點就是2個lazy陣列會相互影響。因為乘影響加,加不影響乘,所以我們先算乘。include include include include include include include include i...