P4145 線段樹點修改 模板題

2022-05-02 01:09:20 字數 930 閱讀 1782

鏈結

題意:對乙個數列進行以下兩種操作:

顯然,區間開平方不滿足區間可加性,所以對區間中每個數開平方不能通過標記完成,只能使用暴力的單點修改。因為1e12的數開方6次就變成了1,所以需要修改的次數實際上很少。同時維護乙個區間最大值maxv,如果maxv大於1才需要進行開平方操作。

1 #include2

using

namespace

std;

34 typedef long

long

ll;5

const

int inf = 0x3f3f3f3f;6

const

int maxn = 100000 + 10

;7 ll maxv[maxn << 2], sum[maxn << 2];8

intn;

9ll a[maxn];

1011

void build(int o, int l, int

r)12

20else

2127}28

29int ql, qr; //

查詢[ql, qr]中的和

30void query(int o,int l,int r, ll&ssum)

3138

else

3949}50

51int cl, cr; //

修改sqrt(a[cl...cr])

52void update(int o, int l, int

r)53

60else

6168}69

70int

main()

7189

else

9096}97

98return0;

99 }

看討論區還有分塊、樹狀陣列+並查集等做法,orz.

題解 洛谷P4145 花神遊歷各國(線段樹)

洛谷p4145 這道題的重點在於sqrt 1 1乙個限制條件 與正常線段樹不同的是區間修改為開方 那麼我們用乙個陣列記錄每個區間的最大值只有當這個區間的最大值大於1時才需要開方 因此 當我們更新到葉子節點時把每個區間的最大值和sum值開方即可 注意題目中說l可能大於r 要交換 include inc...

洛谷P4145上帝造題的七分鐘 區間修改

題目 區間開平方,可以發現其實開幾次就變成1,不需要開了,所以標記一下,每次只去開需要開的地方 原來寫的並查集跳過1或0,然而wa.其實是沒有記錄原陣列的值,因為樹狀陣列存的是修改量 如果a陣列 原陣列 開int會re!改成線段樹,本來想著是這一段區間和只要小於等於其長度就可以跳過了,然而仔細想想完...

線段樹 模板題

problem description 已知乙個數列,你需要進行下面兩種操作 1.將某區間每乙個數加上x 2.求出某區間每乙個數的和 input 第一行包含兩個整數n m,分別表示該數列數字的個數和操作的總個數。第二行包含n個用空格分隔的整數,其中第i個數字表示數列第i項的初始值。接下來m行每行包含...