洛谷p4145:這道題的重點在於sqrt(1)=1乙個限制條件
與正常線段樹不同的是區間修改為開方
那麼我們用乙個陣列記錄每個區間的最大值只有當這個區間的最大值大於1時才需要開方
因此 當我們更新到葉子節點時把每個區間的最大值和sum值開方即可
注意題目中說l可能大於r 要交換
#include#includeview codeusing
namespace
std;
#define ll long long
#define maxn 100010ll sum[maxn
<<2],max[maxn<<2
],a[maxn];
ll n,m;
void
build(ll l,ll r,ll k)
ll mid=(l+r)>>1
; build(l,mid,k
<<1
); build(mid+1,r,k<<1|1
); sum[k]=sum[k<<1]+sum[k<<1|1
]; max[k]=max(max[k<<1],max[k<<1|1]);//
更新上層的值
return;}
ll query(ll x,ll y,ll l,ll r,ll k)
//常規詢問
void
update(ll x,ll y,ll l,ll r,ll k)
ll mid=(l+r)>>1
;
if(x<=mid&&max[k<<1]>1) update(x,y,l,mid,k<<1);//
滿足最大值大於1
if(y>mid&&max[k<<1|1]>1) update(x,y,mid+1,r,k<<1|1
); sum[k]=sum[k<<1]+sum[k<<1|1];//
更新上層的值
max[k]=max(max[k<<1],max[k<<1|1
]);}
intmain()
if(k==0
)
if(k==1
) }}
bzoj 3211 花神遊歷各國 題解
題目傳送門 題意解析 題目就是告訴你n個數,然後有m個詢問,每次詢問有兩個操作,乙個是把一段區間內的和輸出,乙個是把一段區間中的每個數取根號。my opinion 看到這題就應該知道應該用資料結構維護,不過這個根號該怎麼辦呢?我們都知道,根號讓乙個數降下來只需要幾次就好了,而根號1或者0都不會變的,...
P4145 上帝造題的七分鐘2 花神遊歷各國
xlk覺得 上帝造題的七分鐘 不太過癮,於是有了第二部。第一分鐘,x說,要有數列,於是便給定了乙個正整數數列。第二分鐘,l說,要能修改,於是便有了對一段數中每個數都開平方 下取整 的操作。第三分鐘,k說,要能查詢,於是便有了求一段數的和的操作。第四分鐘,彩虹喵說,要是noip難度,於是便有了資料範圍...
P4145 上帝造題的七分鐘2 花神遊歷各國
題目背景 xlk覺得 上帝造題的七分鐘 不太過癮,於是有了第二部。題目描述 第一分鐘,x說,要有數列,於是便給定了乙個正整數數列。第二分鐘,l說,要能修改,於是便有了對一段數中每個數都開平方 下取整 的操作。第三分鐘,k說,要能查詢,於是便有了求一段數的和的操作。第四分鐘,彩虹喵說,要是noip難度...