uoj 228 基礎資料結構練習題

2021-07-25 09:55:29 字數 1341 閱讀 8546

第一次看到這題大概在這裡: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,,成功卡到暴力,所以要特判,原因大概是取整吧。

所以就有了:

後來發現ad忘記賦0。。。

#include#include#include#define n 100005

#define ll long long

using namespace std;

ll n,m,a[n],mx[n<<2],mn[n<<2],sm[n<<2],fl[n<<2],ad[n<<2];

void dn(ll k,ll l,ll r)

if (ad[k]) }

void up(ll k)

void build(ll k,ll l,ll r)

ll mid=l+r>>1;

build(k<<1,l,mid);

build(k<<1|1,mid+1,r);

up(k);

}void add(ll k,ll l,ll r,ll x,ll y,ll z)

ll mid=l+r>>1;

dn(k,l,r);

if (x<=mid) add(k<<1,l,mid,x,y,z);

if (y>mid) add(k<<1|1,mid+1,r,x,y,z);

up(k);

}void mdy(ll k,ll l,ll r,ll x,ll y)

if (mx[k]==mn[k]+1&&t*t==mx[k])

}ll mid=l+r>>1;

dn(k,l,r);

if (x<=mid) mdy(k<<1,l,mid,x,y);

if (y>mid) mdy(k<<1|1,mid+1,r,x,y);

up(k);

}ll qry(ll k,ll l,ll r,ll x,ll y)

int main()

if (p==2) mdy(1,1,n,x,y);

if (p==3) printf("%lld\n",qry(1,1,n,x,y)); }

return 0;

}

UOJ228 基礎資料結構練習題

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

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

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

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

給定序列,要求資瓷區間加 區間開根 區間求和。用線段樹維護最大值 最小值 和。如果 max max min min max max min min 那麼一起處理 打上區間減標記即可。時間複雜度?我太菜了,不知道。au hany01 prob uoj228 基礎資料結構練習題 date jul 31s...