- IDE不开自动补全及括号匹配
- 大括号单独占一行,每一层分支一个制表符,严格缩进
- 操作符两侧不加空格
- 常用的库有
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<cstring>
- 对于循环,使用临时变量i,j,k。对于全局数量用全局变量n,对于询问个数用全局变量q,临时变量起名为tmp,tmpp,tmppp以此类推,多组数据用T表示,下划线变量遍历每个case
- 对于要输出的答案用ans存储,对于函数调用中临时答案用res表示
- 对于同类语句,尽量使用”,”而不是”;”连接
代码实例:(SPOJ GSS5 Can you answer these queries V)
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
using namespace std;
#define mid ((l+r)>>1)
#define ls rt<<1
#define rs rt<<1|1
#define lson ls,l,mid
#define rson rs,mid+1,r
const int maxn=10000+10;
struct node
{
int sum,l,r,m;
}tree[maxn<<2];
int a[maxn],n,q;
int sum[maxn];
inline void pushup(int rt)
{
tree[rt].sum=tree[ls].sum+tree[rs].sum;
tree[rt].l=max(tree[ls].l,tree[ls].sum+tree[rs].l);
tree[rt].r=max(tree[rs].r,tree[rs].sum+tree[ls].r);
tree[rt].m=max(tree[ls].r+tree[rs].l,max(tree[ls].m,tree[rs].m));
}
void build(int rt,int l,int r)
{
if(l==r)
{
tree[rt].sum=a[l];
tree[rt].l=tree[rt].r=tree[rt].m=a[l];
return;
}
build(lson),build(rson);
pushup(rt);
}
int ql(int rt,int l,int r,int L,int R)
{
if(L>R)return 0;
if(L==l&&r==R)return tree[rt].l;
if(R<=mid)return ql(lson,L,R);
if(L>mid)return ql(rson,L,R);
return max(ql(lson,L,mid),ql(rson,mid+1,R)+sum[mid]-sum[L-1]);
}
int qr(int rt,int l,int r,int L,int R)
{
if(L>R)return 0;
if(L==l&&r==R)return tree[rt].r;
if(R<=mid)return qr(lson,L,R);
if(L>mid)return qr(rson,L,R);
return max(qr(rson,mid+1,R),qr(lson,L,mid)+sum[R]-sum[mid]);
}
int qm(int rt,int l,int r,int L,int R)
{
if(L>R)return 0;
if(L==l&&r==R)return tree[rt].m;
if(R<=mid)return qm(lson,L,R);
if(L>mid)return qm(rson,L,R);
return max(qr(lson,L,mid)+ql(rson,mid+1,R),max(qm(lson,L,mid),qm(rson,mid+1,R)));
}
int main()
{
int T;
scanf("%d",&T);
for(int _=1;_<=T;++_)
{
scanf("%d",&n);
for(int i=1;i<=n;++i)scanf("%d",&a[i]),sum[i]=sum[i-1]+a[i];
build(1,1,n);
scanf("%d",&q);
int x1,y1,x2,y2;
int ans;
for(int i=1;i<=q;++i)
{
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
if(y1<x2)
{
ans=sum[x2-1]-sum[y1];
ans+=qr(1,1,n,x1,y1);
ans+=ql(1,1,n,x2,y2);
}
else
{
ans=qm(1,1,n,x2,y1);
ans=max(ans,ql(1,1,n,y1+1,y2)+qr(1,1,n,x2,y1));
ans=max(ans,qr(1,1,n,x1,x2-1)+ql(1,1,n,x2,y1));
ans=max(ans,ql(1,1,n,y1+1,y2)+qr(1,1,n,x1,x2-1)+sum[y1]-sum[x2-1]);
}
printf("%d\n",ans);
}
}
}