第一次看到這題大概在這裡: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...