hdu 6638 Snowy Smile
原文鏈接: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)題。
- 上一篇: 江苏高考时间2021成绩查询,小高考时间
- 下一篇: 图像滤镜艺术---PS引擎库发布