代码习惯(待更新)

  • 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);
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值