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 ...
随机推荐
- js取自定义data属性
//20170329 原本以为只能attr或者prop来获取属性,但是今天看别人的代码他自定义了一个属性,却取不到他的属性值,我自己在本地又可以取到,难道是phtml的原因,于是我到网上查找,发现了一 ...
- redis键的过期和内存淘汰策略
键的过期时间 设置过期时间 Redis可以为存储在数据库中的值设置过期时间,作为一个缓存数据库,这个特性是很有帮助的.我们项目中的token或其他登录信息,尤其是短信验证码都是有时间限制的. 按照传统 ...
- numpy.tile()
numpy.tile()是个什么函数呢,说白了,就是把数组沿各个方向复制 比如 a = np.array([0,1,2]), np.tile(a,(2,1))就是把a先沿x轴(就这样称呼吧)复制 ...
- Aizu - 1379 Parallel Lines
平行直线 题意:给出一些点,这些点两两相连成一条直线,问最多能连成多少条直线. 思路:暴力出奇迹!!记得当时比赛做这道题的时候一直依赖于板子,结果却限制了自己的思路,这得改.dfs直接暴力,但是需要将 ...
- Nginx反向代理WebSocket(WSS)
1. WebSocket协议 WebSocket 协议提供了一种创建支持客户端和服务端实时双向通信Web应用程序的方法.作为HTML5规范的一部分,WebSockets简化了开发Web实时通信程序的难 ...
- 33.bucket与metric核心概念讲解
主要知识点: bucket与metric核心慨念 一.核心慨念 1.bucket:一个数据分组 比如有下面几条数据: city name 北京 小李 北京 小王 上海 小张 上海 小丽 上海 小陈 ...
- springcloud(七): 使用Feign调用Eureka Server客户端服务
当我们通过RestTemplate调用其它服务的API时,所需要的参数须在请求的URL中进行拼接,如果参数少的话或许我们还可以忍受,一旦有多个参数的话,这时拼接请求字符串就会效率低下,并且显得好傻. ...
- Oracle学习总结(5)—— SQL语句经典案例
--0.所有员工信息 SELECT * FROM emp --1.选择部门30的所有员工 SELECT * FROM emp WHERE deptno=20 --2.列出所有办事员(CLERK)的姓名 ...
- HDU - 1403 - Longest Common Substring
先上题目: Longest Common Substring Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 65536/32768 K ...
- [Bzoj4196] [NOI2015] 软件包管理器 [树链剖分,线段树]
题解摘要:树链剖分后用线段树区间查询修改,对于安装软件,将改点到根的路径全部变为1,对于卸载软件,将子树清空.注意边界,编号是从0开始的,容易漏掉树根. 第一次写树剖- #include <io ...