花神遊歷各國 bzoj3211 線段樹

2021-07-30 15:29:14 字數 1387 閱讀 2427

有乙個n個數的序列a,請寫乙個程式完成下列操作:

1 l r表示查詢l到r的和

2 l r表示把每個a[x] (l<=x<=r)變為sqrt(x)

n<=100000,m<=100000

其實我是偶然看過冪偉的題解的(滑稽 109

最多開根6次就變成1了,對於1無論怎樣開根都是不影響的

兩種做法。如果是樹狀陣列的話用鍊錶或者並查集記錄一下每個數字下乙個不是1的數字的位置,這樣子均攤就是接近o(1)的了

線段樹呢記錄一下當前區間是否全部為1,然後這樣即使日到底也不懼了。實測線段樹會慢一點,但是好寫啊

許可權題啊,什麼時候我也能有bzoj的許可權號呢?

#include #include #define rep(i, st, ed) for (int i = st; i <= ed; i += 1)

#define ll long long

#define n 100001

struct treenodet[n * 4 + 1];

inline ll read()

while (ch <= '9' && ch >= '0')

return x;

}inline ll query(int

now, int l, int r)else

if (r <= mid)else

if (l > mid)else

}inline void modify(int

now, int l, int r)else

if (l == r)else

return;

}if (r <= mid)else

if (l > mid)else

t[now].sum = t[now

<< 1].sum + t[now

<< 1 | 1].sum;

t[now].c = t[now

<< 1].c & t[now

<< 1 | 1].c;

}inline void build(int

now, int l, int r);

if (l == r)

build(now

<< 1, l, mid);

build(now

<< 1 | 1, mid + 1, r);

t[now].sum = t[now

<< 1].sum + t[now

<< 1 | 1].sum;

t[now].c = t[now

<< 1].c & t[now

<< 1 | 1].c;

}int main(void)else

if (opt == 2)

}return 0;

}

BZOJ3211 花神遊歷各國

3211 花神遊歷各國 time limit 5 sec memory limit 128 mb submit 1144 solved 416 submit status discuss description input output 每次x 1時,每行乙個整數,表示這次旅行的開心度 sample...

bzoj3211 花神遊歷各國

其實這是一道sb題 哦不其實是兩道2333333 還有3038也是同一題 然而在寫3038的時候由於資料太水直接就a掉了。剛剛拿之前的code交上去就wa啦。不能判斷區間和是否 r l 1因為會出現0 所以要開多乙個東西表示這個區間還有多少個數不會再改變了 每個數可以開方的次數是很小的,就當做是常數...

bzoj 3211 花神遊歷各國

每次x 1時,每行乙個整數,表示這次旅行的開心度 4 1 100 5 5 51 1 2 2 1 2 1 1 2 2 2 3 1 1 4 10111 11對於100 的資料,n 100000,m 200000 data i 非負且小於10 9 對於這個開方,一開始yy了好久,後來發現,10 9的數頂多...