题意:求区间最大的子段和 这题之前写过 然后今天重写了一遍 感觉确实是区间合并的好题

解法:要开四个域 分别是当前段的和 左起连续最大和 右起连续最大和 区间最大子段和

然后询问的时候维护一个当前最大和一个最大前缀和 总之就是要考虑到各种可能出现最大和的情况就可以了

#include<cstdio>
#include<iostream>
#include<limits.h>
using namespace std;
#define maxn 55555
#define ls (rt<<1)
#define rs (rt<<1|1)
#define mid ((l+r)>>1)
int n,m,le[maxn<<2],ri[maxn<<2],sum[maxn<<2],ma[maxn<<2],x,y,mi,pre;
inline void up(int rt){sum[rt]=sum[ls]+sum[rs];le[rt]=max(le[ls],sum[ls]+le[rs]);ri[rt]=max(ri[rs],sum[rs]+ri[ls]);ma[rt]=max(max(ma[ls],ma[rs]),(ri[ls]+le[rs]));
}
inline void build(int rt,int l,int r){if(l==r){scanf("%d",&x);le[rt]=ri[rt]=sum[rt]=ma[rt]=x;return ;}build(ls,l,mid);build(rs,mid+1,r);up(rt);
}
inline void query(int rt,int l,int r,int L,int R){if(L<=l&&r<=R){mi=max(max(pre+le[rt],ma[rt]),mi);pre=max(pre+sum[rt],ri[rt]);return ;}if(L<=mid)query(ls,l,mid,L,R);if(mid<R)query(rs,mid+1,r,L,R);
}
int main(){scanf("%d",&n);build(1,1,n);scanf("%d",&m);while(m--){mi=-INT_MAX;pre=0;scanf("%d%d",&x,&y);query(1,1,n,x,y);printf("%d\n",mi);}return 0;
}

今天特意写ggs6的时候重新改了一发这一题 这也是醉了 居然splay过不了

难道是常数真的太大了吗

不对 应该是spoj真的是太慢了 反正改了结构体就过了 这真的是醉了啊

以下是tle的代码 感觉看还是能看的 就是真的卡死了啊

#include<map>
#include<set>
#include<cstring>
#include<stdio.h>
#include<vector>
#include<cstdio>
#include<iostream>
#include<string.h>
#include<algorithm>
#include<limits.h>
using namespace std;
#define maxn 222222
#define inf 2100000000
#define ls ch[rt][0]
#define rs ch[rt][1]
#define rrs ch[root][1]
#define rls ch[root][0]
int ch[maxn][2],key[maxn],fa[maxn],sz[maxn];
int lmax[maxn],rmax[maxn],sum[maxn],smax[maxn];
int root,cnt,lim;
inline bool scan(int &ret) {char c; int sgn;if(c=getchar(),c==EOF) return 0; //EOFwhile(c!='-'&&(c<'0'||c>'9')) c=getchar();sgn=(c=='-')?-1:1;ret=(c=='-')?0:(c-'0');while(c=getchar(),c>='0'&&c<='9') ret=ret*10+(c-'0');ret*=sgn;return 1;
}
inline void init(int rt){smax[rt]=lmax[rt]=rmax[rt]=-inf;key[rt]=sum[rt]=0;ch[rt][0]=ch[rt][1]=fa[rt]=sz[rt]=0;
}
inline void up(int rt){if(!rt)return ;lmax[rt]=lmax[ls];lmax[rt]=max(lmax[rt],sum[ls]+key[rt]+lmax[rs]);lmax[rt]=max(lmax[rt],sum[ls]+key[rt]);rmax[rt]=rmax[rs];rmax[rt]=max(rmax[rt],sum[rs]+key[rt]+rmax[ls]);rmax[rt]=max(rmax[rt],sum[rs]+key[rt]);sum[rt]=sum[ls]+sum[rs]+key[rt];smax[rt]=max(smax[ls],smax[rs]);int ll,rr;ll=max(0,rmax[ls]); rr=max(0,lmax[rs]);smax[rt]=max(smax[rt],ll+rr+key[rt]);sz[rt]=sz[ls]+sz[rs]+1;
}
inline void rot(int rt){int f=fa[rt],side=ch[f][1]==rt,ll=ch[rt][!side];fa[ll]=f,ch[f][side]=ll;fa[rt]=fa[f],ch[fa[f]][ch[fa[f]][1]==f]=rt;fa[f]=rt,ch[rt][!side]=f;up(f),up(rt);
}
inline void splay(int rt,int aim){while(fa[rt]!=aim){int f=fa[rt],ff=fa[f];if(ff==aim)rot(rt);else if((ch[f][1]==rt)==(ch[ff][1]==f))rot(f),rot(rt);else rot(rt),rot(rt);}if(!aim)root=rt;
}int cur;
inline void find(int sub,int tot){int rt=sub;while(1){if(sz[ls]==tot-1)break;if(sz[ls]>=tot)rt=ls;else tot-=sz[ls]+1,rt=rs;}cur=rt;splay(rt,fa[sub]);
}
inline void insert(int a,int b)
{find(root,a+1);init(cnt+1);ch[++cnt][1]=ch[root][1];fa[rrs]=cnt;key[cnt]=b;ch[root][1]=cnt;fa[cnt]=root;ch[cnt][0]=0;up(cnt); up(root);
}
inline void delet(int a){find(root,a+1);find(rrs,1);ch[rrs][0]=rls;fa[rls]=rrs;root=rrs;fa[root]=0;ch[0][1]=root;up(root);
}
inline void  replace(int n,int val){find(root,n+1);key[cur]=val;up(cur); //up(root);
}
int qu(int a,int b){find(root,a);find(rrs,b-a+2);return smax[ch[rrs][0]];
}
char cmd[12];
int n,m,x,y;
int main(){while(~scanf("%d",&n)){root=0;init(0);lim=inf;for(int i=1;i<=n;++i){init(i);scan(key[i]);fa[i]=i-1;ch[i-1][1]=i;sz[i]=1;up(i-1);sum[i]=lmax[i]=rmax[i]=smax[i]=key[i];splay(i,0);}splay(1,0);init(n+1);fa[n+1]=1,ch[1][0]=n+1;sz[n+1]=1;up(n+1);splay(n+1,0);splay(n,0);init(n+2);fa[n+2]=n;ch[n][1]=n+2;sz[n+2]=1;up(n);splay(n+2,0);cnt=n+2;scan(m);while(m--){scanf("%d%d",&x,&y);printf("%d\n",qu(x,y));}}return 0;
}

SPOJ GGS1 线段树相关推荐

  1. SPOJ 2713 线段树(sqrt)

    题意:       给你n个数(n <= 100000),然后两种操作,0 x y :把x-y的数全都sqrt ,1 x y:输出 x-y的和. 思路:       直接线段树更新就行了,对于当 ...

  2. SPOJ GSS3-Can you answer these queries III-分治+线段树区间合并

    Can you answer these queries III SPOJ - GSS3 这道题和洛谷的小白逛公园一样的题目. 传送门: 洛谷 P4513 小白逛公园-区间最大子段和-分治+线段树区间 ...

  3. SPOJ 375 Query on a tree(线段树维护树链剖分)

    题目链接:http://www.spoj.com/problems/QTREE/ 题意:给出一个树,两种操作:(1)修改某条边的权值:(2)询问某两个顶点之间边的最大值. 思路:树的路径剖分和线段树维 ...

  4. SPOJ KGSS Maximum Sum (线段树)

    SPOJ KGSS Maximum Sum 题意:求区间最大值与第二大值之和 思路:线段树维护两个最大值 /********************************************** ...

  5. SPOJ - DQUERY D-query(莫队/线段树+离线/主席树)

    题目链接:点击查看 题目大意:给出一个由n个数组成的序列,再给出m次查询,每次查询区间[l,r]中有多少个不同的数 题目分析:莫队模板题,直接套板子就好了 有点意思的是函数返回值为布尔类型,然后没有r ...

  6. SPOJ - QTREE Query on a tree(树链剖分+线段树)

    题目链接:点击查看 题目大意:给出一棵由n个点组成的树,再给出数个操作,每次操作分为下列几种类型: QUERY x y:询问点x-点y这条路径上的所有边权的最大值 CHANGE x y:将第x条边的权 ...

  7. SPOJ - GSS3 Can you answer these queries III(线段树+区间合并)

    题目链接:点击查看 题目大意:给出一个长度为n的序列,进行m次操作: 1 x y  查询区间[l,r]中的最大连续子段和 0 x y  将第x个数修改为y 题目分析:因为涉及到单点修改和区间查询等操作 ...

  8. Can you answer these queries V SPOJ - GSS5 (分类讨论+线段树维护区间最大子段和)

    recursion有一个整数序列a[n].现在recursion有m次询问,每次她想知道Max { A[i]+A[i+1]+...+A[j] ; x1 <= i <= y1 , x2 &l ...

  9. D-query SPOJ - DQUERY(求区间不同数的个数)(树状数组||线段树+离散)(主席树+在线)

    English Vietnamese Given a sequence of n numbers a1, a2, -, an and a number of d-queries. A d-query ...

最新文章

  1. js技巧--转义符\的妙用
  2. python温度转换代码分析_Python温度转换实例分析
  3. 自开发Web应用和SAP Customer Data Cloud Identity服务的集成
  4. 如何将IntelliJ项目添加到GitHub
  5. 第一章 Shiro简介——《跟我学Shiro》
  6. sample等价是什么错误_一个复制粘贴引发的有趣小错误及思考
  7. 【欧洲已死】李开复:欧洲人工智能毫无希望
  8. git中如何提交空目录
  9. js base64图片太大_JS实现base64图片下载 简易方法
  10. 【BZOJ 3652】大新闻 数位dp+期望概率dp
  11. Unit Testing with JUnit - Tutorial
  12. 全国大学生电子设计竞赛 控制类赛题分析
  13. nit计算机应用基础考试系统,NIT考试计算机应用基础试题
  14. matlab数字图像处理实验一:图像的读取显示存储、平移镜像放大缩小及旋转
  15. CentOS 7 iSCSI 多路径(Multipath)配置
  16. vscode中backspace按键失效
  17. A记录、CNAME、MX记录、NS记录的区别和联系
  18. Qt Creator编写C++中文乱码解决方法
  19. MATLAB2018simulink打不开MATLAB2019b的simulink,低版本simulink模型出现
  20. php微信支付需要哪些设置,如何申请和配置微信支付接口?

热门文章

  1. 互联网企业都有哪些技术类岗位
  2. jmeter 自定义参数_jmeter用户自定义变量的实际使用
  3. MAC 有些网址可以 ping 通,但是浏览器打不开
  4. tar: cannot change ownership to uid ***, gid ***: Operation not permitted
  5. 这篇spring事务理解透了,工资直接涨10K
  6. 传感器:土壤湿度传感器(XH-M214)介绍及stm32驱动代码
  7. 3632: 外太空旅行
  8. 【第170期】给@Steve的简历分析:不自卑,但我确实在仰望
  9. 什么是数学的核心素养?
  10. 浅谈数据中心里的光纤测温技术