HDU 4037 線段樹 區間開根號

2021-09-25 10:38:00 字數 1360 閱讀 2752

區間開根號是不具備整體性的,即和開根號不一定等於開根號的和。但是由於由於在longlong範圍內的數開根號7次就會變成一所以我們單點更新也是可以的,剪枝就是如果乙個區間的和等於區間的大小就不用再繼續向下更新了,實現也簡單;

ps:再注意幾個坑,每組樣例結束要多輸出乙個空行,and l,r的大小不確定

ac:

#includeusing namespace std;

typedef long long ll;

const int inf = 0x3f3f3f3f;

const double pi = acos(-1);

namespace

}#define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);

#define _for(n,m,i) for (int i = (n); i < (m); i++)

#define _rep(n,m,i) for (int i = (n); i <= (m); i++)

#define lson rt << 1, l, mid

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

#define lowbit(x) x & (-x)

#define pii pair#define fi first

#define se second

const int n = 1e5+5;

ll t[n<<2];

void push_up(int rt)

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

int mid = l + r >> 1;

build(lson);build(rson);

push_up(rt);

} void updata(int rt, int l, int r, int l, int r)

int mid = l + r >> 1;

if(l <= mid) updata(lson, l, r);

if(r > mid) updata(rson, l, r);

push_up(rt);

} ll qry(int rt, int l, int r, int l, int r)

int mid = l + r >> 1;

ll ret = 0;

if(l <= mid) ret += qry(lson, l, r);

if(r > mid) ret += qry(rson, l, r);

return ret;

}int main()

printf("\n");

}}

HDU 4027 線段樹區間開根號

這道線段樹的題目我並沒有按照線段樹的模板寫,這裡把要點講出來就行了。第一 區間開根號不像區間乘或者除,能通過區間和然後一次性乘除求出乙個區間的乘除,所以區間開根號只能乙個乙個的開,但是如果乙個乙個的開不會超時嗎?假設乙個數在long long的範圍裡面,也就是2 63這個範圍內,那麼對這個數開根號最...

Hdu4027 線段樹開根號區間求和

題意 給定100000個數,兩種操作,0 i j表示將i j這段的數字都開根號 向下取整 1 i j表示查詢i j之間的所有值的和 所有的和都不超過64位 思路 如果直接用線段樹更新會tle,此題的關鍵是要理解對任何64位以內的值,開根號最多不會超過7次,所以用線段樹做,更新到葉子節點的次數最多7次...

HDU5828 區間開根加法求和 線段樹

先需要想到乙個結論 對於線段樹上的一塊,進行整體開根和加法 加法不影響結果 的次數越多,區間的最大值與最小值的差越小。利用這個性質,我們維護一棵線段樹,線段樹上維護區間最大值 最小值 和 元素個數。對於建樹 區間加法 修改 區間查詢,寫法就是樸素的線段樹 對於區間開根 1 若區間最大值和最小值的差為...