【题解】洛谷P4145 花神游历各国(线段树)
生活随笔
收集整理的這篇文章主要介紹了
【题解】洛谷P4145 花神游历各国(线段树)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
洛谷P4145:https://www.luogu.org/problemnew/show/P4145
思路
這道題的重點(diǎn)在于sqrt(1)=1 一個(gè)限制條件
與正常線段樹不同的是區(qū)間修改為開方
那么我們用一個(gè)數(shù)組記錄每個(gè)區(qū)間的最大值 只有當(dāng)這個(gè)區(qū)間的最大值大于1時(shí)才需要開方
因此 當(dāng)我們更新到葉子節(jié)點(diǎn)時(shí)把每個(gè)區(qū)間的最大值和sum值開方即可
注意題目中說l可能大于r 要交換
代碼
#include<iostream> #include<cmath> using namespace std; #define ll long long #define maxn 100010 ll sum[maxn<<2],Max[maxn<<2],a[maxn]; ll n,m; void build(ll l,ll r,ll k) {if(l==r){sum[k]=a[l];Max[k]=sum[k];//葉子節(jié)點(diǎn) return;}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)//常規(guī)詢問 {if(x<=l&&r<=y) return sum[k];ll res=0;ll mid=(l+r)>>1;if(x<=mid) res+=query(x,y,l,mid,k<<1);if(y>mid) res+=query(x,y,mid+1,r,k<<1|1);return res; } void update(ll x,ll y,ll l,ll r,ll k) {if(l==r)//葉子節(jié)點(diǎn)時(shí) {sum[k]=sqrt(sum[k]);Max[k]=sqrt(Max[k]);return;}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]); } int main() {cin>>n;for(ll i=1;i<=n;i++) cin>>a[i];build(1,n,1);cin>>m;for(ll i=1;i<=m;i++){ll k,l,r;cin>>k>>l>>r;if(l>r)//交換 {int temp;temp=l;l=r;r=temp;}if(k==0){update(l,r,1,n,1);}if(k==1){cout<<query(l,r,1,n,1)<<endl;}} } View Code?
轉(zhuǎn)載于:https://www.cnblogs.com/BrokenString/p/9762423.html
總結(jié)
以上是生活随笔為你收集整理的【题解】洛谷P4145 花神游历各国(线段树)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DNF私服单机搭建教程
- 下一篇: Idea运行项目报错:java.lang