SPOJ GSS1 & GSS3&挂了的GSS5
线段树然后yy一下,搞一搞。
GSS1: 
题意:求最大区间和。
#include <cstdio>
#include <algorithm>
using namespace std;
int lm[200005],rm[200005],ma[200005],s[200005],left,right,n,m,ans,rans;
void build(int l,int r,int num){
    if(l==r){scanf("%d",&ma[num]);rm[num]=lm[num]=s[num]=ma[num];return;}
    int mid=(l+r)/2;
    build(l,mid,num*2);
    build(mid+1,r,num*2+1);
    s[num]=s[num*2]+s[num*2+1];
    lm[num]=max(lm[num*2],s[num*2]+lm[num*2+1]);
    rm[num]=max(rm[num*2+1],s[num*2+1]+rm[num*2]);
    ma[num]=max(lm[num*2+1]+rm[num*2],max(ma[num*2+1],ma[num*2]));
}
void find(int l,int r,int num){
    if(l>=left&&r<=right){
        ans=max(ans,max(ma[num],rans+lm[num]));
        rans=max(rm[num],rans+s[num]);
        return;
    }
    int mid=(l+r)/2;
    if(mid>=left)find(l,mid,num*2);
    if(mid<right)find(mid+1,r,num*2+1);
}
int main()
{
    scanf("%d",&n);
    build(1,n,1);
    scanf("%d",&m);
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d",&left,&right);
        rans=ans=-1*0x3fffffff,find(1,n,1),printf("%d\n",ans);
    }
}GSS3: 
GSS3就是GSS1加一个修改操作。
#include <cstdio>
#include <cstring>
#include <algorithm>
#define inf 0x3fffffff
#define N 2000000
using namespace std;
int n,m,s[N],ma[N],lm[N],rm[N],jy,le,ri,ans,rans;
void bu(int l,int r,int num){
    if(l==r){scanf("%d",&s[num]),ma[num]=lm[num]=s[num]=rm[num]=s[num];return;}
    int m=(l+r)/2;
    bu(l,m,num*2);bu(m+1,r,num*2+1);
    lm[num]=max(lm[num*2],lm[num*2+1]+s[num*2]);
    rm[num]=max(rm[num*2+1],s[num*2+1]+rm[num*2]);
    s[num]=s[num*2]+s[num*2+1];
    ma[num]=max(ma[num*2],max(ma[num*2+1],lm[num*2+1]+rm[num*2]));
}
void fi(int l,int r,int num){
    if(l>=le&&r<=ri){
        ans=max(ans,max(ma[num],rans+lm[num]));
        rans=max(rm[num],rans+s[num]);
        return;
    }
    int m=(l+r)/2;
    if(m>=le)fi(l,m,num*2);
    if(m<ri)fi(m+1,r,num*2+1);
}
void ch(int l,int r,int num){
    if(l==r){ma[num]=lm[num]=s[num]=rm[num]=s[num]=ri;return;}
    int m=(l+r)/2;
    if(m>=le)ch(l,m,num*2);
    else ch(m+1,r,num*2+1);
    lm[num]=max(lm[num*2],lm[num*2+1]+s[num*2]);
    rm[num]=max(rm[num*2+1],s[num*2+1]+rm[num*2]);
    s[num]=s[num*2]+s[num*2+1];
    ma[num]=max(ma[num*2],max(ma[num*2+1],lm[num*2+1]+rm[num*2]));
}
int main()
{
    scanf("%d",&n);
    bu(1,n,1);
    scanf("%d",&m);
    for(int i=1;i<=m;i++){
        scanf("%d%d%d",&jy,&le,&ri);
        if(jy){rans=ans=-inf;fi(1,n,1);printf("%d\n",ans);}
        else ch(1,n,1);
    }
} GSS5写挂ing……自己写了个对拍,和网上AC的code拍,一开始还找出来点儿错,交上去,WA,,,完之后就不知道错哪了,ZRT只是说我的maker写得没有问题,还说什么线段树的错特别难找。。就挂了。。。。。。
放个WA code吧。。。(但是至少能水掉90%的官方数据,100%我的自测数据。。目前已拍30000多组)
#include <cstdio>
#include <cstring>
#include <algorithm>
#define inf 0x3fffffff
#define N 2000000
using namespace std;
int n,m,s[N],ma[N],lm[N],rm[N],jy,ans,rans,lans,cases;
void bu(int l,int r,int num){
    if(l==r){scanf("%d",&s[num]),ma[num]=lm[num]=s[num]=rm[num]=s[num];return;}
    int m=(l+r)/2;
    bu(l,m,num*2);bu(m+1,r,num*2+1);
    lm[num]=max(lm[num*2],lm[num*2+1]+s[num*2]);
    rm[num]=max(rm[num*2+1],s[num*2+1]+rm[num*2]);
    s[num]=s[num*2]+s[num*2+1];
    ma[num]=max(ma[num*2],max(ma[num*2+1],lm[num*2+1]+rm[num*2]));
}
void fm(int left,int right,int l,int r,int num){
    if(l>=left&&r<=right){
        ans=max(ans,max(ma[num],rans+lm[num]));
        rans=max(rm[num],rans+s[num]);
        return;
    }
    int m=(l+r)/2;
    if(m>=left)fm(left,right,l,m,num*2);
    if(m<right)fm(left,right,m+1,r,num*2+1);
}
int fs(int left,int right,int l,int r,int num){
    if(left<=l&&right>=r)return s[num];
    int m=(l+r)/2,sum=0;
    if(m>=left)sum+=fs(left,right,l,m,num*2);
    if(m<right)sum+=fs(left,right,m+1,r,num*2+1);
    return sum;
}
void fl(int left,int right,int l,int r,int num){
    if(left<=l&&right>=r){
        rans=max(rans+s[num],rm[num]);
        return;
    }
    int m=(l+r)/2;
    if(m>=left)fl(left,right,l,m,num*2);
    if(m<right)fl(left,right,m+1,r,num*2+1);
}
void fr(int left,int right,int l,int r,int num){
    if(left<=l&&right>=r){
        lans=max(lans+s[num],lm[num]);
        return;
    }
    int m=(l+r)/2;
    if(m<right)fr(left,right,m+1,r,num*2+1);
    if(m>=left)fr(left,right,l,m,num*2);
}
int main()
{
    int x1,x2,y1,y2;
    scanf("%d",&cases);
    while(cases--){
        scanf("%d",&n);
        bu(1,n,1);
        scanf("%d",&m);
        for(int i=1;i<=m;i++){
            lans=rans=ans=-inf;
            scanf("%d%d%d%d",&x1,&x2,&y1,&y2);
            if(y1>x2){
                if(x2>x1&&y2>y1){
                int Q=fs(x2,y1,1,n,1);
                fl(x1,x2-1,1,n,1);
                fr(y1+1,y2,1,n,1);
                ans=max(Q,max(max(rans+Q,lans+Q),rans+lans+Q));
                printf("%d\n",ans);
                }
                else if(x1==x2){
                    int Q=fs(x2,y1,1,n,1);
                    fr(y1+1,y2,1,n,1);
                    ans=max(lans,lans+Q);
                    printf("%d\n",ans);
                }
                else if(y1==y2)
                {
                    int Q=fs(x2,y1,1,n,1);
                    fl(x1,x2-1,1,n,1);
                    ans=max(rans,Q+rans);
                    printf("%d\n",ans);
                }
            }
            else if(y1==x2){
                if(x2-1>=x1)fl(x1,x2-1,1,n,1);
                if(y1+1<=y2)fr(y1+1,y2,1,n,1);
                int Q=fs(y1,y1,1,n,1);
                ans=max(Q,max(max(Q+lans,Q+rans),Q+lans+rans));
                printf("%d\n",ans);
            }
            else if(y1<x2){
                fl(x1,y1,1,n,1);fr(y1,y2,1,n,1);int Q=fs(y1,y1,1,n,1);
                ans=max(rans,max(lans,rans+lans-Q));
                rans=lans=-inf;
                fl(x1,x2,1,n,1);fr(x2,y2,1,n,1);Q=fs(x2,x2,1,n,1);
                ans=max(ans,max(lans,max(rans,rans+lans-Q)));
                rans=lans=-inf;
                fm(y1,x2,1,n,1);
                printf("%d\n",ans);
            }
        }
    }
}这么杂乱无章&冗长的代码不是我的风格,但是越改代码越丑。。。。。
SPOJ GSS1 & GSS3&挂了的GSS5的更多相关文章
- spoj gss1 gss3
		传送门 gss1 gss3 spoj gss系列=最大字段和套餐 gss1就是gss3的无单点修改版 有区间查询和单点修改,考虑用线段树维护 我们要维护区间权值和\(s\),区间最大前缀和\(xl\) ... 
- SPOJ GSS1 && GSS3 (无更新/更新单点,并询问区间最大连续和)
		http://www.spoj.com/problems/GSS1/ 题意:无更新询问区间最大连续和. 做法:线段树每个节点维护sum[rt],maxsum[rt],lsum[rt],rsum[rt] ... 
- SPOJ - GSS1&&GSS3
		GSS1 #include<cstdio> #include<iostream> #define lc k<<1 #define rc k<<1|1 u ... 
- SPOJ GSS1 - Can you answer these queries I(线段树维护GSS)
		Can you answer these queries I SPOJ - GSS1 You are given a sequence A[1], A[2], -, A[N] . ( |A[i]| ≤ ... 
- [题解] SPOJ GSS1 - Can you answer these queries I
		[题解] SPOJ GSS1 - Can you answer these queries I · 题目大意 要求维护一段长度为 \(n\) 的静态序列的区间最大子段和. 有 \(m\) 次询问,每次 ... 
- GSS系列(1)——GSS1&&GSS3
		题意:询问一个区间内的最大连续子段和(GSS1),并且有单点修改的操作(GSS2). 思路:这个题目在老人家的大白鼠里出现过,不过那个是求两个下标,并且相同取更小值.——传的东西更多,判断也稍微繁琐一 ... 
- SPOJ - GSS1 —— 线段树 (结点信息合并)
		题目链接:https://vjudge.net/problem/SPOJ-GSS1 GSS1 - Can you answer these queries I #tree You are given ... 
- SPOJ GSS1 Can you answer these queries I[线段树]
		Description You are given a sequence A[1], A[2], ..., A[N] . ( |A[i]| ≤ 15007 , 1 ≤ N ≤ 50000 ). A q ... 
- SPOJ GSS1 Can you answer these queries I
		Time Limit: 115MS Memory Limit: 1572864KB 64bit IO Format: %lld & %llu Description You are g ... 
随机推荐
- 前端自动化构建工具gulp使用
			1. 全局安装 gulp: $ npm install --global gulp 2. 作为项目的开发依赖(devDependencies)安装: $ npm install --save-dev ... 
- C解析config
			#cat bb.c #include <stdio.h> #include <stdlib.h> #include <string.h> #include < ... 
- [工具]iostat
			本文主要分析了Linux的iostat命令的源码 iostat源码共563行,应该算是Linux系统命令代码比较少的了.源代码中主要涉及到如下几个Linux的内核文件: 1./proc/disksta ... 
- Netty 长连接服务
			转自:https://www.dozer.cc/2014/12/netty-long-connection.html 推送服务 还记得一年半前,做的一个项目需要用到 Android 推送服务.和 iO ... 
- .net performance optimize  your C#  app  读书笔记
			目录 序 作者简介 推荐人简介 感谢 本书简介 第一章 性能指标 第二章 性能测量 第三章 内部类型 第四章 垃圾回收机制 第五章 集合和泛型 第六章 并发和并行性 第七章 网络.I / ... 
- SharePoint 2013:解决爬网出错的问题
			现象: 以前一直正常的爬网突然无法顺利完成,总是在进行到某个部分就停滞不前. 调查: 在查看了log文件后,发现了这条错误 06/24/2014 11:14:51.86 NodeRunnerQue ... 
- POJ2777 Count Color 线段树区间更新
			题目描写叙述: 长度为L个单位的画板,有T种不同的颜料.现要求按序做O个操作,操作分两种: 1."C A B C",即将A到B之间的区域涂上颜色C 2."P A B&qu ... 
- Sahara中的数据模型
			声明: 本博客欢迎转载.但请保留原作者信息,并请注明出处! 作者:郭德清 团队:华为杭州OpenStack团队 本文主要是介绍下Sahara中一些常见的数据模型. 1.Config 用于描写叙述配置信 ... 
- js获得子页面元素
			在主页面中.添加iframe子页面,假设须要获得子页面的元素则能够使用javascript的contentWindow来获得,注意iframe和frameset必须加入id.详细样例例如以下: mai ... 
- 基于Windows Azure 搭建基于SharePoint 2010 Intranet、Extranet、Internet (4): 配置传出邮件服务: 使用 outlook.com 发送邮件通知
			前几篇文章,已经安装了SharePoint 2010,今天将演示如何配置传出邮件.由于某些原因,企业可能没有安装自己邮件服务器,此时我们可以使用公共的邮箱服务来发送邮件通知,比如outlook.com ... 
