隐藏页面特效

SPOJ - GSS1&&GSS3

 

 

GSS1

#include<cstdio> #include<iostream> #define lc k<<1 #define rc k<<1|1 using namespace std; const int M=1e5+5,N=M<<2; struct sgt{ int sum,gss,lgss,rgss; }tr[N]; int n,m,a[N]; void updata(int k){ tr[k].sum=tr[lc].sum+tr[rc].sum; tr[k].lgss=max(tr[lc].lgss,tr[lc].sum+tr[rc].lgss); tr[k].rgss=max(tr[rc].rgss,tr[rc].sum+tr[lc].rgss); tr[k].gss=max(max(tr[lc].gss,tr[rc].gss),tr[lc].rgss+tr[rc].lgss); } void build(int k,int l,int r){ if(l==r){ tr[k].sum=tr[k].gss=tr[k].lgss=tr[k].rgss=a[l]; return ; } int mid=l+r>>1; build(lc,l,mid); build(rc,mid+1,r); updata(k); } sgt query(int k,int l,int r,int x,int y){ if(l==x&&r==y) return tr[k]; int mid=l+r>>1; if(y<=mid) return query(lc,l,mid,x,y); else if(x>mid) return query(rc,mid+1,r,x,y); else{ sgt left,right,result; left=query(lc,l,mid,x,mid); right=query(rc,mid+1,r,mid+1,y); result.sum=left.sum+right.sum; result.lgss=max(left.lgss,left.sum+right.lgss); result.rgss=max(right.rgss,right.sum+left.rgss); result.gss=max(max(left.gss,right.gss),left.rgss+right.lgss); return result; } } int main(){ scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d",&a[i]); } build(1,1,n); scanf("%d",&m); for(int i=1,x,y;i<=m;i++){ scanf("%d%d",&x,&y); printf("%d\n",query(1,1,n,x,y).gss); } return 0; }

GSS3

#include<cstdio> #include<iostream> #define lc k<<1 #define rc k<<1|1 using namespace std; const int M=1e5+5,N=M<<2; struct sgtment{ int sum,gss,lgss,rgss; }tr[N]; int n,m,a[N]; void updata(int k){ tr[k].sum=tr[lc].sum+tr[rc].sum; tr[k].lgss=max(tr[lc].lgss,tr[lc].sum+tr[rc].lgss); tr[k].rgss=max(tr[rc].rgss,tr[rc].sum+tr[lc].rgss); tr[k].gss=max(max(tr[lc].gss,tr[rc].gss),tr[lc].rgss+tr[rc].lgss); } void build(int k,int l,int r){ if(l==r){ tr[k].sum=tr[k].gss=tr[k].lgss=tr[k].rgss=a[l]; return ; } int mid=l+r>>1; build(lc,l,mid); build(rc,mid+1,r); updata(k); } void change(int k,int l,int r,int pos,int val){ if(l==r){ tr[k].sum=tr[k].gss=tr[k].lgss=tr[k].rgss=val; return ; } int mid=l+r>>1; if(pos<=mid) change(lc,l,mid,pos,val); else change(rc,mid+1,r,pos,val); updata(k); } sgtment query(int k,int l,int r,int x,int y){ if(l==x&&r==y) return tr[k]; int mid=l+r>>1; if(y<=mid) return query(lc,l,mid,x,y); else if(x>mid) return query(rc,mid+1,r,x,y); else{ sgtment left,right,result; left=query(lc,l,mid,x,mid); right=query(rc,mid+1,r,mid+1,y); result.sum=left.sum+right.sum; result.lgss=max(left.lgss,left.sum+right.lgss); result.rgss=max(right.rgss,right.sum+left.rgss); result.gss=max(max(left.gss,right.gss),left.rgss+right.lgss); return result; } } int main(){ scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d",&a[i]); } build(1,1,n); scanf("%d",&m); for(int i=1,opt,x,y;i<=m;i++){ scanf("%d%d%d",&opt,&x,&y); if(opt) printf("%d\n",query(1,1,n,x,y).gss); else change(1,1,n,x,y); } return 0; }

 


__EOF__

本文作者shenben
本文链接https://www.cnblogs.com/shenben/p/6361623.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   神犇(shenben)  阅读(1415)  评论(3编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
点击右上角即可分享
微信分享提示