日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

hdu 3308 线段树

發(fā)布時(shí)間:2023/12/10 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hdu 3308 线段树 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

輸入一串?dāng)?shù)字,有兩個(gè)操作:Q a b 查詢a到b區(qū)間內(nèi)嚴(yán)格遞增子串的最大長(zhǎng)度 ; U a b 把第a位數(shù)字替換成b 。注意輸入的編號(hào)是從0開(kāi)始

解法:線段樹(shù)維護(hù)區(qū)間的嚴(yán)格遞增子串的最大長(zhǎng)度即可。注意細(xì)節(jié)。

#include <iostream> #include <algorithm> #include <cstdio> #include <cstring>using namespace std; struct Tree{int l,r;int valuel,valuer,value;int ld,rd;}nod[100020<<2]; int n,m; int w[1000020] ;void Pushup(int k) {nod[k].valuel = nod[k].valuer = 1;if(nod[k<<1].rd < nod[k<<1|1].ld){nod[k].value=max(nod[k<<1].valuer+nod[k<<1|1].valuel,max(nod[k<<1].value,nod[k<<1|1].value));if(nod[k<<1].valuel == nod[k<<1].r-nod[k<<1].l+1 ){nod[k].valuel=nod[k<<1].valuel+nod[k<<1|1].valuel ;}if(nod[k<<1|1].valuer == nod[k<<1|1].r-nod[k<<1|1].l+1){nod[k].valuer=nod[k<<1|1].valuer+nod[k<<1].valuer;}nod[k].valuel=max(nod[k].valuel,nod[k<<1].valuel) ;nod[k].valuer=max(nod[k].valuer,nod[k<<1|1].valuer) ;//cout<<nod[2].valuer<<endl; }else{nod[k].value=max(nod[k<<1].value,nod[k<<1|1].value) ;nod[k].valuel = nod[k<<1].valuel ;nod[k].valuer = nod[k<<1|1].valuer ;}nod[k].ld=nod[k<<1].ld , nod[k].rd=nod[k<<1|1].rd ; }void Build(int l,int r,int k) {nod[k].l=l,nod[k].r=r , nod[k].ld=w[nod[k].l] , nod[k].rd=w[nod[k].r] ;if(nod[k].l == nod[k].r){nod[k].value= nod[k].valuel =nod[k].valuer= 1;return ;}int mid = (l+r)>>1 ;Build(l,mid,k<<1);Pushup(k) ;Build(mid+1,r,k<<1|1);Pushup(k); }int Query(int l,int r,int k) {int ans =0;if(nod[k].l==l && nod[k].r==r ){return nod[k].value ;}int mid=(nod[k].l + nod[k].r)>>1 ;if(r<=mid){return Query(l,r,k<<1) ;}else if(l>mid){return Query(l,r,k<<1|1) ;}else{if(nod[k<<1].rd < nod[k<<1|1].ld ){ans = max(Query(l,mid,k<<1) , Query(mid+1,r,k<<1|1)) ;int temp = min(mid-l+1,nod[k<<1].valuer)+min(r-(mid+1)+1,nod[k<<1|1].valuel) ;ans=max(ans,temp);}else{ans= max(Query(l,mid,k<<1),Query(mid+1,r,k<<1|1)) ;}}return ans ;}void Update(int l,int k,int value) {if(nod[k].l==nod[k].r && nod[k].l == l){nod[k].ld = nod[k].rd = value ;w[nod[k].r]=value ;nod[k].valuel = nod[k].valuer = nod[k].value =1 ;return ;}int mid=(nod[k].l+ nod[k].r)>>1 ;if(l<=mid){Update(l,k<<1,value);}else{Update(l,k<<1|1,value) ;}Pushup(k);return ;} int main() {int t;scanf("%d",&t) ;while(t--){scanf("%d%d",&n,&m) ;memset(w,0,sizeof w) ;for(int i=1;i<=n;i++){scanf("%d",&w[i]) ;}//getchar() ; Build(1,n,1) ;/*for(int i=1;i<=30;i++){cout<<i<<" "<<nod[i].value<<" "<<nod[i].valuel<<" "<<nod[i].valuer<<endl;}cout<<"-------------------------------------"<<endl;*/for(int i=0;i<m;i++){char c;int a,b;cin>>c;scanf("%d%d",&a,&b);//cout<<c<<endl;if(c=='Q'){a++,b++;if(a>b){swap(a,b) ;}int ans = Query(a,b,1);//cout<<c<<endl;printf("%d\n",ans) ;}else{a++;Update(a,1,b) ;/*for(int i=1;i<=30;i++){cout<<i<<" "<<nod[i].value<<" "<<nod[i].valuel<<" "<<nod[i].valuer<<endl;}cout<<"-------------------------------------"<<endl;*/}}}return 0; }

?

轉(zhuǎn)載于:https://www.cnblogs.com/Scale-the-heights/p/4707336.html

總結(jié)

以上是生活随笔為你收集整理的hdu 3308 线段树的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。