bzoj 3038 上帝造題的七分鐘2

2021-07-10 22:37:55 字數 1781 閱讀 5742

time limit: 3 sec  

memory limit: 128 mb

submit: 923  

solved: 413 [

submit][

status][

discuss]

xlk覺得《上帝造題的七分鐘》不太過癮,於是有了第二部。

"第一分鐘,x說,要有數列,於是便給定了乙個正整數數列。

第二分鐘,l說,要能修改,於是便有了對一段數中每個數都開平方(下取整)的操作。

第三分鐘,k說,要能查詢,於是便有了求一段數的和的操作。

第四分鐘,彩虹喵說,要是noip難度,於是便有了資料範圍。

第五分鐘,詩人說,要有韻律,於是便有了時間限制和記憶體限制。

第六分鐘,和雪說,要省點事,於是便有了保證運算過程中及最終結果均不超過64位有符號整數型別的表示範圍的限制。

第七分鐘,這道題終於造完了,然而,造題的神牛們再也不想寫這道題的程式了。"

——《上帝造題的七分鐘·第二部》

所以這個神聖的任務就交給你了。

第一行乙個整數n,代表數列中數的個數。

第二行n個正整數,表示初始狀態下數列中的數。

第三行乙個整數m,表示有m次操作。

接下來m行每行三個整數k,l,r,k=0表示給[l,r]中的每個數開平方(下取整),k=1表示詢問[l,r]中各個數的和。

對於詢問操作,每行輸出乙個回答。 10

1 2 3 4 5 6 7 8 9 10

50 1 10

1 1 10

1 1 5

0 5 8

1 4 8197

61:對於100%的資料,1<=n<=100000,1<=l<=r<=n,數列中的數大於0,且不超過1e12。

2:資料不保證l<=r 若l>r,請自行交換l,r,謝謝!

題解:線段樹

如果乙個數等於0或1,那麼他再開平方不變,所以可以標記一下,如果一定的左右子樹都已經被標記,那麼就沒必要再修改了

#include#include#include#include#define n 100003

#define ll long long

using namespace std;

ll n,m;

ll a[n],tr[4*n],delta[4*n];

void update(ll x)

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

ll mid=(l+r)/2;

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

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

update(now);

}ll qjsum(ll now,ll l,ll r,ll lx,ll rr)

ll mid=(l+r)/2;

ll sum=0;

if (lx<=mid)

sum+=qjsum(now<<1,l,mid,lx,rr);

if (rr>mid)

sum+=qjsum(now<<1|1,mid+1,r,lx,rr);

return sum;

}void change(ll now,ll l,ll r,ll lx,ll rr)

ll mid=(l+r)/2;

if (lx<=mid) change(now<<1,l,mid,lx,rr);

if (rr>mid) change(now<<1|1,mid+1,r,lx,rr);

update(now);

}int main()

}

BZOJ 3038 上帝造題的七分鐘2

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

bzoj3038 上帝造題的七分鐘2

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

BZOJ3038 上帝造題的七分鐘2

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