hdu1698(線段樹 區間修改 求和)

2021-10-19 17:58:51 字數 1948 閱讀 8020

題意:

有乙個區間s [1,n],每一節si的初始價值為1。定義操作:x y val,將區間[x,y]中的每乙個小節的價值改為val。問:經過q次操作後總區間的價值是多少。

1<=n<=1e5

0<=q<=1e5

演算法/資料結構:

線段樹注意使用:long long scanf("%i64d")

3*10e5我覺得不需要長整型,但不知道為甚用int就是錯!艹,搞這個點搞了一晚上。

**:

#include

#include

#include

#include

#include

#include

using

namespace std;

typedef

long

long ll;

const

int maxn =

1e5+3;

ll tree[maxn<<2]

;//4被空間,線段樹,表示對應樹區間的價值

int tag[maxn<<2]

;//對應樹區間的整體操作標記:1,2,3

void

push_up

(int rt)

//向上更新tree[rt]

void

push_down

(int l,

int r,

int rt)

//向下更新

}#define lson l, mid, rt<<1

#define rson mid+1, r, rt<<1|1

void

build

(int l,

int r,

int rt)

int mid =

(l+r)

>>1;

build

(lson)

;build

(rson)

;push_up

(rt);}

void

update

(int l,

int r,

int val,

int l,

int r,

int rt)

//對相應區間進行相應操作

push_down

(l, r, rt)

;//需要破壞當前整體性,向下更新

int mid =

(l+r)

>>1;

if(l <= mid)

update

(l, r, val, lson);if

(r > mid)

update

(l, r, val, rson)

;push_up

(rt);}

ll query

(int l,

int r,

int l,

int r,

int rt)

//區間查詢

push_down

(l, r, rt)

;//向下查詢需要破壞當前區間的整體操作

int mid =

(l+r)

>>1;

ll ret =0;

if(l <= mid) ret +

=query

(l, r, lson);if

(r > mid) ret +

=query

(l, r, rson)

;return ret;

}int

main()

printf

("case %d: the total value of the hook is %i64d.\n"

, case,

query(1

, n,

1, n,1)

);}return0;

}

HDU 1698 線段樹區間修改

一道線段樹區間替換的模板題 練習一下notonlysuccess的線段樹模板 注意注意!這兩個運算符號的優先順序非常低,只要寫到就要加括號,調了兩個小時的血淚啊 include include define lson l,m,rt 1 define rson m 1,r,rt 1 1 define ...

hdu 1698 線段樹區間修改

題目鏈結 解題報告 區間修改的模板題目。需要打乙個set標記,表示區間 l,r 被修改為v.在這道題目裡。一開始所有結點被賦值為1,之後給q個修改,把 l,r 修改為1,2,或3.最後求區間和。我的寫法採用了劉汝佳在訓練指南中使用的寫法。參考 include include include incl...

HDU 1698 線段樹區間更新

之前一直覺得自己線段樹敲得很熟練,然後。某天。是的,就是我的資料結構周開始的時候我發現。我特麼才會單點更新是怎麼回事!只會區間查詢是腫麼回事!摔!恩。就是表達一下弱渣的心情。區間更新,用到延遲操作。延遲操作應該是這麼回事。線段樹的優越性就是體現在,第一是二分查詢,第二是區間操作。當我們需要多次對區間...