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

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

生活随笔

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

编程问答

hdu 6638 Snowy Smile

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

原文鏈接:https://blog.csdn.net/wu_tongtong/article/details/73385029

線段樹的區(qū)間最大子段和:

線段樹需要維護(hù)的是:?
左端點(diǎn) x?
右端點(diǎn) y ?(本人喜歡直接維護(hù)端點(diǎn))?
[x,y]內(nèi)的最大子段和 ms?
[x,y]的區(qū)間和 s?
[x,y]內(nèi)的緊靠左端點(diǎn)的最大子段和 ls?
[x,y]內(nèi)的緊靠右端點(diǎn)的最大子段和 rs

困難就是,update和ask(l,r)詢問(wèn)[l,r]區(qū)間內(nèi)的最大子段和?
那我們一步一步來(lái)

s的維護(hù)很常規(guī),?
ls:有兩種情況:?
1.該區(qū)間內(nèi)的ls是ta左兒子的ls?
2.該區(qū)間內(nèi)的ls是左兒子的s+右兒子的ls?
同理,rs:有兩種情況:?
1.該區(qū)間內(nèi)的rs是ta右兒子的rs?
2.該區(qū)間內(nèi)的rs是右兒子的s+左兒子的rs?
而ms有三種情況:?
1.該區(qū)間內(nèi)的ms是左兒子的ms?
2.該區(qū)間內(nèi)的ms是右兒子的ms?
3.該區(qū)間內(nèi)的ms是左兒子的rs+右兒子的ls?

這個(gè)題離散化坐標(biāo),以y為軸,然后再插入x就好了。

看了這個(gè)大佬的博客https://blog.csdn.net/A_Thinking_Reed_/article/details/98778260

?

#include <bits/stdc++.h> using namespace std; #define LL long long const int maxn=2005; struct node{LL x,y,val; }p[maxn]; struct tree{LL sum,sum_max,ls_max,rs_max; }tree[maxn*4];int t,n; vector<int>vx,vy;int get_x(int x){ return (lower_bound(vx.begin(),vx.end(),x)-vx.begin())+1;} int get_y(int x){ return (lower_bound(vy.begin(),vy.end(),x)-vy.begin())+1;}bool cmp(node a,node b){if(a.y==b.y)return a.x<b.x;elsereturn a.y<b.y; }void build_tree(int rt,int sx,int ex){tree[rt].ls_max=tree[rt].rs_max=tree[rt].sum=tree[rt].sum_max=0;if(sx==ex)return ;int mid=(sx+ex)>>1;build_tree(rt<<1,sx,mid);build_tree(rt<<1|1,mid+1,ex); } void pushup(int st){int rs=st<<1|1,ls=st<<1;tree[st].sum=tree[rs].sum+tree[ls].sum;tree[st].sum_max=max(max(tree[ls].sum_max,tree[rs].sum_max) ,tree[ls].rs_max+tree[rs].ls_max );tree[st].ls_max=max(tree[ls].ls_max , tree[ls].sum+tree[rs].ls_max);tree[st].rs_max=max(tree[rs].rs_max , tree[rs].sum+tree[ls].rs_max);}void update(int st,int l,int r,int pos,LL val){if(l==r){tree[st].sum+=val;tree[st].ls_max=tree[st].rs_max=tree[st].sum_max=tree[st].sum;return ;}int mid=(l+r)>>1;if(pos<=mid)update(st<<1,l,mid,pos,val);elseupdate(st<<1|1,mid+1,r,pos,val);pushup(st);}int main( ) {freopen("in.txt","r",stdin);ios::sync_with_stdio(false);cin>>t;while(t--){cin>>n;vx.clear(); vy.clear();for(int i=1;i<=n;i++){cin>>p[i].x>>p[i].y>>p[i].val;vx.push_back(p[i].x);vy.push_back(p[i].y);}sort(vx.begin(),vx.end()),sort(vy.begin(),vy.end());vx.erase(unique(vx.begin(),vx.end()),vx.end());vy.erase(unique(vy.begin(),vy.end()),vy.end());for(int i=1;i<=n;i++){p[i].x=get_x(p[i].x);p[i].y=get_y(p[i].y);}sort(p+1,p+n+1,cmp);LL sum_max=0,last=-1,nx=vx.size();for(int i=1;i<=n;i++){ //遍歷Y的底邊if(p[i].y==last) continue;//相同的底邊跳過(guò)build_tree(1,1,nx);for(int j=i,k=j;j<=n;j=k){//Y的上端while(k<=n&&p[k].y==p[j].y){update(1,1,nx,p[k].x,p[k].val);k++;}sum_max=max(sum_max,tree[1].sum_max);}last=p[i].y;}cout<<sum_max<<endl;}Snowy Smilereturn 0; }


?

總結(jié)

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

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