bzoj3038(線段樹開根)

2021-07-22 20:27:08 字數 1553 閱讀 4674

法1,因為最多不會開根6次,所以開根,直接搞

#include#include#include#include#includeusing namespace std;

typedef long long ll;

inline ll read()

int n;

struct aa

a[100025*4];

void up(int i)

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

int mid=(l+r)>>1;

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

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

up(i);

}void updata(int i,int l,int r)

int mid=(a[i].l+a[i].r)>>1;

if(r<=mid) updata(i<<1,l,r);

else if (l>mid) updata(i<<1|1,l,r);

else updata(i<<1,l,mid),updata(i<<1|1,mid+1,r);

up(i);

}ll query(int i,int l,int r)

int main()

return 0;

}

方法2(我自己的):

也是在最多不超過6次的基礎上想的,存乙個sum【0....6】表示區間開i次根的和,發現這樣是可以合併的,並且也僅僅是常數的複雜度。

#include#include#include#include#includeusing namespace std;

typedef long long ll;

inline ll read()

int n;

struct aa

a[100005*4];

void up(int i)

void down(int i)

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

int mid=(l+r)>>1;

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

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

up(i);

}void updata(int i,int l,int r)

down(i);

int mid=(a[i].l+a[i].r)>>1;

if(r<=mid) updata(i<<1,l,r);

else if (l>mid) updata(i<<1|1,l,r);

else updata(i<<1,l,mid),updata(i<<1|1,mid+1,r);

up(i);

}ll query(int i,int l,int r)

int main()

return 0;

}

總結:線段樹在打標記時的更新當前資料那個地方需要非常關注,容易出錯。

同時資料結構題對拍的重要性真的是不言而喻!對拍的話,這些細節就很容易避免了。

bzoj3038 上帝造題的七分鐘2 線段樹

ac通道 線段樹是我最不熟悉的東西之一,於是找幾道題搞搞 這題就很簡單了 有乙個神奇的優化 如果乙個結點值為0或者1就不再更新 如果一棵樹左右兒子都不再更新,它也不再更新 include include include include include include includeusing nam...

BZOJ3038 線段樹 上帝造題的七分鐘2

題目 xlk覺得 上帝造題的七分鐘 不太過癮,於是有了第二部。第一分鐘,x說,要有數列,於是便給定了乙個正整數數列。第二分鐘,l說,要能修改,於是便有了對一段數中每個數都開平方 下取整 的操作。第三分鐘,k說,要能查詢,於是便有了求一段數的和的操作。第四分鐘,彩虹喵說,要是noip難度,於是便有了資...

bzoj 3038 上帝造題的七分鐘2

time limit 3 sec memory limit 128 mb submit 923 solved 413 submit status discuss xlk覺得 上帝造題的七分鐘 不太過癮,於是有了第二部。第一分鐘,x說,要有數列,於是便給定了乙個正整數數列。第二分鐘,l說,要能修改,於...