給定序列,要求資瓷區間加、區間開根、區間求和。
用線段樹維護最大值、最小值、和。如果
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 就給乙個完全平...