題解 洛谷P4145 花神遊歷各國(線段樹)

2022-05-05 20:42:08 字數 1186 閱讀 9848

洛谷p4145:

這道題的重點在於sqrt(1)=1乙個限制條件

與正常線段樹不同的是區間修改為開方

那麼我們用乙個陣列記錄每個區間的最大值只有當這個區間的最大值大於1時才需要開方

因此 當我們更新到葉子節點時把每個區間的最大值和sum值開方即可

注意題目中說l可能大於r 要交換

#include#include

using

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

) }}

view code

bzoj 3211 花神遊歷各國 題解

題目傳送門 題意解析 題目就是告訴你n個數,然後有m個詢問,每次詢問有兩個操作,乙個是把一段區間內的和輸出,乙個是把一段區間中的每個數取根號。my opinion 看到這題就應該知道應該用資料結構維護,不過這個根號該怎麼辦呢?我們都知道,根號讓乙個數降下來只需要幾次就好了,而根號1或者0都不會變的,...

P4145 上帝造題的七分鐘2 花神遊歷各國

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

P4145 上帝造題的七分鐘2 花神遊歷各國

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