GSS1

#include<cstdio>
#include<iostream>
#define lc k<<1
#define rc k<<1|1
using namespace std;
const int M=1e5+,N=M<<;
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>>;
build(lc,l,mid);
build(rc,mid+,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>>;
if(y<=mid) return query(lc,l,mid,x,y);
else if(x>mid) return query(rc,mid+,r,x,y);
else{
sgt left,right,result;
left=query(lc,l,mid,x,mid);
right=query(rc,mid+,r,mid+,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=;i<=n;i++){
scanf("%d",&a[i]);
}
build(,,n);
scanf("%d",&m);
for(int i=,x,y;i<=m;i++){
scanf("%d%d",&x,&y);
printf("%d\n",query(,,n,x,y).gss);
}
return ;
}

GSS3

#include<cstdio>
#include<iostream>
#define lc k<<1
#define rc k<<1|1
using namespace std;
const int M=1e5+,N=M<<;
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>>;
build(lc,l,mid);
build(rc,mid+,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>>;
if(pos<=mid) change(lc,l,mid,pos,val);
else change(rc,mid+,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>>;
if(y<=mid) return query(lc,l,mid,x,y);
else if(x>mid) return query(rc,mid+,r,x,y);
else{
sgtment left,right,result;
left=query(lc,l,mid,x,mid);
right=query(rc,mid+,r,mid+,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=;i<=n;i++){
scanf("%d",&a[i]);
}
build(,,n);
scanf("%d",&m);
for(int i=,opt,x,y;i<=m;i++){
scanf("%d%d%d",&opt,&x,&y);
if(opt) printf("%d\n",query(,,n,x,y).gss);
else change(,,n,x,y);
}
return ;
}

最新文章

  1. Asp.net Core 通过 Ef Core 访问、管理Mysql
  2. Oracle10G无图形安装及升级
  3. js与jquery异同
  4. LUA 协程
  5. 微型 ORM-FluentData 温故知新系列
  6. C++ 牛人博客(不断更新中...)
  7. Linux 中使用 KVM
  8. 修改FFMpeg源码—捕获丢包
  9. 用Python作GIS之四:Tkinter基本界面的搭建
  10. ecstore 后台登陆跳转到 api失败,中心请求网店API失败
  11. 关于U3D画面出现卡顿的问题
  12. thinkphp 模板中赋值
  13. [ACM] HDU 5025 Saving Tang Monk (状态压缩,BFS)
  14. 手机自动化测试:appium源码分析之bootstrap二
  15. 给dataframe添加一列索引
  16. Item 17: 理解特殊成员函数的生成规则
  17. java操作redis之按照关键字删除缓存数据
  18. C#文件流的读写
  19. setTimeout中调用this
  20. $().click()和$(document).on(&#39;click&#39;,&#39;要选择的元素&#39;,function(){})的不同

热门文章

  1. Linux System Programming 学习笔记(六) 进程调度
  2. JSTL &lt;C:if&gt;&lt;/C:if&gt; 和&lt;C:ForEach&gt;&lt;/C:ForEach&gt; 入门级~
  3. 【Windows API】OpenClipboard --- 剪切板(转)
  4. 转载 linux 僵尸进程,讲的很透彻
  5. 快充 IC BQ25896 的 ICO (input current optimizer)
  6. elasticsearch入库错误:gc overhead导致数据节点脱离集群
  7. js-无缝向上滚动
  8. GPP加密破解工具gpp-decrypt
  9. spring事务再次理解
  10. [IOS笔记] - 动画animation