UOJ228 基礎資料結構練習題(線段樹)

2021-08-21 23:51:51 字數 2570 閱讀 2345

給定序列,要求資瓷區間加、區間開根、區間求和。

用線段樹維護最大值、最小值、和。如果

max−

max−−−

−√=min

−min−−

−√max

−max

=min

−min

,那麼一起處理、打上區間減標記即可。

時間複雜度??我太菜了,不知道。。。

/**************************************

* au: hany01

* prob: [uoj228] 基礎資料結構練習題

* date: jul 31st, 2018

* email: [email protected]

**************************************/

#include

using

namespace

std;

typedef

long

long ll;

typedef pair pii;

typedef

vector

vi;

#define file(a) freopen(a".in", "r", stdin), freopen(a".out", "w", stdout)

#define rep(i, j) for (register int i = 0, i##_end_ = j; i < i##_end_; ++ i)

#define for(i, j ,k) for (register int i = (j), i##_end_ = (k); i <= i##_end_; ++ i)

#define fordown(i, j, k) for (register int i = (j), i##_end_ = (k); i >= i##_end_; -- i)

#define set(a, b) memset(a, b, sizeof(a))

#define cpy(a, b) memcpy(a, b, sizeof(a))

#define sz(a) ((int)(a.size()))

#define all(a) a.begin(), a.end()

#define pb(a) push_back(a)

#define mp(a, b) make_pair(a, b)

#define x first

#define y second

#define inf (0x3f3f3f3f)

#define inf1 (2139062143)

#define y1 wozenmezhemecaia

#ifdef hany01

#define debug(...) fprintf(stderr, __va_args__)

#else

#define debug(...)

#endif

template

inline

bool chkmax(t &a, t b)

template

inline

bool chkmin(t &a, t b)

inline

int read()

const

int maxn = 1e5 + 5;

ll mn[maxn << 2], mx[maxn << 2], sm[maxn << 2], tag[maxn << 2];

#define lc (t << 1)

#define rc (lc | 1)

#define mid ((l + r) >> 1)

inline

void maintain(int t)

inline

void pushdown(int t, int l, int r)

}inline

void mark(int t, int l, int r, ll dt)

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

void update1(int t, int l, int r, int x, int y, int dt)

pushdown(t, l, r);

if (x <= mid) update1(lc, l, mid, x, y, dt);

if (y > mid) update1(rc, mid + 1, r, x, y, dt);

maintain(t);

}void update2(int t, int l, int r, int x, int y)

}pushdown(t, l, r);

if (x <= mid) update2(lc, l, mid, x, y);

if (y > mid) update2(rc, mid + 1, r, x, y);

maintain(t);

}ll query(int t, int l, int r, int x, int y)

int main()

return

0;}

uoj 228 基礎資料結構練習題

第一次看到這題大概在這裡 2016多校聯合 反正當時也沒什麼想法,表示有區間加好難受。題解並不難,維護每個區間最值 和,當乙個區間開根後所有值都一樣就直接賦值,否則遞迴。存在一種特例 3 4 3 4 3 4 3 4 3,開根後1 2 1 2 1 2 1 2 1.2 3 4 3 4 3 4 3 4 3...

UOJ228 基礎資料結構練習題

作者部落格 正解 線段樹 解題報告 這道題是一道線段樹的神題,需要我們支援區間開方 區間加法和區間求和操作。關鍵是對於開方操作的處理,考慮如果乙個區間最大值等於最小值 即全都相等 那麼就可以直接開方,然後區間賦值。否則就往下遞迴處理,知道發現整個區間相等再區間操作。上述做法在這樣的資料下會被卡tle...

題解 uoj228 基礎資料結構練習題

題目大意 給定乙個序列,要求支援區間加 區間開根號 區間求和操作。線段樹,我們可以像往常一樣判斷區間內的數是否都相等,如果相等就直接區間賦值,否則暴力遞迴下去。但是開根號還有一種特殊情況 3 4 3 4 3 4 開完根號1 2 1 2 1 2 同時加上2又變回了3 4 3 4 3 4 就給乙個完全平...