CSU OJ 集訓難度(線段樹)

2021-08-25 17:02:08 字數 1952 閱讀 4413

小l正在組織acm暑假集訓,但眾所周知,暑假集訓的萌新中有oi神犇,也有暑假才開始學演算法的萌新,如果統一集訓的難度,無法很好地讓萌新們得到訓練,所以小l想了乙個辦法,根據每次測試的情況,改變萌新們的集訓難度。現在將萌新們編號為1到n,最初萌新們的集訓難度為v0,測試後有兩種操作,第一種是某一區間的萌新的集訓難度同時提高,另一種是將某一段區間的萌新的集訓難度變為同乙個數,同時,wells希望在某次調整難度之後,知道某一段區間的萌新的集訓難度之和,由於小l比較鶸,他並不知道如何快速解決這個問題,你能幫幫他嘛?

input

第一行三個數n,m,v0 表示有n名萌新和m次調整,初始時全部萌新的集訓難度都為v0

第2~m+1行 每行三個數或四個數

0 x y v 表示把 [x,y]區間內的萌新的集訓難度都增加v

1 x y v 表示把 [x,y]區間內的萌新的集訓難度都變為v

2 x y表示詢問[x,y]區間內萌新的集訓難度之和

0output

每個詢問一行,輸出答案

sample input

3 5 0

0 1 3 1

1 2 3 2

2 1 1

2 2 2

2 2 3

sample output

1

24

hint

#include#include#define n 100001

using namespace std;

int n,m,x,y;

long long z,val,ans;

struct node

tree[n<<2];

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

int mid=l+r>>1;

build(k<<1,l,mid);

build(k<<1|1,mid+1,r);

tree[k].sum=tree[k<<1].sum+tree[k<<1|1].sum;

}void pushup(int k)

void pushdown_set(int k)

void pushdown_add(int k)

void set(int k,int l,int r,long long z)//區間修改為某個值

if(tree[k].v) pushdown_set(k);

if(tree[k].add) pushdown_add(k);

int mid=tree[k].l+tree[k].r>>1;

if(l<=mid) set(k<<1,l,r,z);

if(r>mid) set(k<<1|1,l,r,z);

pushup(k);

}void add(int k,int l,int r,long long z)//區間加上某個值

if(tree[k].v) pushdown_set(k);

if(tree[k].add) pushdown_add(k);

int mid=tree[k].l+tree[k].r>>1;

if(l<=mid) add(k<<1,l,r,z);

if(r>mid) add(k<<1|1,l,r,z);

pushup(k);

} void query(int k,int l,int r)

if(tree[k].v) pushdown_set(k);

if(tree[k].add) pushdown_add(k);

int mid=tree[k].l+tree[k].r>>1;

if(l<=mid) query(k<<1,l,r);

if(r>mid) query(k<<1|1,l,r);

}int main()

else if(temp==1)

else}}

CSU OJ2151 集訓難度

小l正在組織acm暑假集訓,但眾所周知,暑假集訓的萌新中有oi神犇,也有暑假才開始學演算法的萌新,如果統一集訓的難度,無法很好地讓萌新們得到訓練,所以小l想了乙個辦法,根據每次測試的情況,改變萌新們的集訓難度。現在將萌新們編號為1到n,最初萌新們的集訓難度為v0,測試後有兩種操作,第一種是某一區間的...

集訓 Tire 線段樹

訓練題目位址 virtual judge problem a uva 11488 字典樹問題 view source on github problem b hdu 1251 字典樹 view source on github problem c hdu 1247 字典樹 view source o...

集訓 DP 搜尋 線段樹

集訓contest位址 vj private contest 128411 problem a poj 1018 剛開始非常缺乏思路,後來聽大家的討論再研究一下發現這道題可以暴力列舉a的。需要注意的是 f和 lf的問題。其實這個鍋不能給c g 編譯器,怪就怪當年的c標準委員會。double本來就應該...