題目大意:
給定乙個序列,要求支援區間加、區間開根號、區間求和操作。
線段樹,我們可以像往常一樣判斷區間內的數是否都相等,如果相等就直接區間賦值,否則暴力遞迴下去。但是開根號還有一種特殊情況:3 4 3 4 3 4……開完根號1 2 1 2 1 2……同時加上2又變回了3 4 3 4 3 4……就給乙個完全平方數和完全平方數減一的數開根號時得到的結果依然相差一,所以這樣就會毫無疑問的tle,所以還需要判斷這種情況,直接打上區間減法標記。
#include
#include
#include
using
namespace
std;
template
inline
void read(t &x)
typedef
long
long ll;
const
int maxn=100010;
struct segment_tree
void build(int x,int *a,int l,int r)
int mid=(l+r)>>1;
build(lc,a,l,mid);build(rc,a,mid+1,r);
update(x);
}void pushadd(int x,ll val)
void pushsame(int x,ll val)
void pushdown(int x)
if(add[x])
}void add(int x,int l,int r,ll val)
void sqrt(int x,int l,int r)
pushdown(x);
sqrt(lc,l,r);sqrt(rc,l,r);
update(x);
}ll query(int x,int l,int r)
}tree;
int n,m,a[maxn];
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 基礎資料結構練習題(線段樹)
給定序列,要求資瓷區間加 區間開根 區間求和。用線段樹維護最大值 最小值 和。如果 max max min min max max min min 那麼一起處理 打上區間減標記即可。時間複雜度?我太菜了,不知道。au hany01 prob uoj228 基礎資料結構練習題 date jul 31s...