鏈結
題意:對乙個數列進行以下兩種操作:
顯然,區間開平方不滿足區間可加性,所以對區間中每個數開平方不能通過標記完成,只能使用暴力的單點修改。因為1e12的數開方6次就變成了1,所以需要修改的次數實際上很少。同時維護乙個區間最大值maxv,如果maxv大於1才需要進行開平方操作。
1 #include2using
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行每行包含...