法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說,要能修改,於...