zoukankan      html  css  js  c++  java
  • 北大zhw大神bzoj1756代码

    #include <cmath>
    #include <cstdio>
    #include <cstdlib>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    int tree[1048576][7],a[600005],n,m,A,B,C,i,ans,t,x;
    void Update(int x)
    {
        tree[x][2]=tree[x*2][2]+tree[x*2+1][2];
        tree[x][3]=max(tree[x*2][3],tree[x*2+1][3]);
        tree[x][4]=max(tree[x*2][4],tree[x*2][2]+tree[x*2+1][4]);
        tree[x][5]=max(tree[x*2+1][5],tree[x*2+1][2]+tree[x*2][5]);
        tree[x][6]=max(max(tree[x*2][6],tree[x*2+1][6]),tree[x*2][5]+tree[x*2+1][4]);
    }
    int WORK(int root,int l,int r)
    {
        if (tree[root][0]==l && tree[root][1]==r) return tree[root][3];
        int mid=(tree[root][0]+tree[root][1])/2,p=-2000000000,q=-2000000000;
        if (l<=mid) p=WORK(root*2,l,min(mid,r));
        if (r>mid) q=WORK(root*2+1,max(l,mid+1),r);
        return max(p,q);
    }
    void work(int root,int l,int r)
    {
        if (tree[root][0]==l && tree[root][1]==r)
        {
            ans=max(ans,tree[root][4]+t);
            ans=max(ans,tree[root][6]);
            t=max(t+tree[root][2],tree[root][5]);
            t=max(t,0);
            return;
        }
        int mid=(tree[root][0]+tree[root][1])/2;
        if (l<=mid) work(root*2,l,min(mid,r));
        if (r>mid) work(root*2+1,max(mid+1,l),r);
    }
    int main()
    {
        scanf("%d%d",&n,&m);
        for (i=1; i<=n; i++) scanf("%d",&a[i]);
        for (i=524288; i<=1048575; i++)
        {
            tree[i][0]=tree[i][1]=i;
            tree[i][2]=tree[i][3]=a[i-524287];
            tree[i][4]=tree[i][5]=tree[i][6]=max(a[i-524287],0);
        }
        for (i=524287; i>=1; i--)
        {
            tree[i][0]=tree[i*2][0];
            tree[i][1]=tree[i*2+1][1];
            Update(i);
        }
        for (i=1; i<=m; i++)
        {
            scanf("%d%d%d",&A,&B,&C);
            if (A==2)
            {
                x=524287+B;
                tree[x][2]=tree[x][3]=C;
                tree[x][4]=tree[x][5]=tree[x][6]=max(C,0);
                while (x!=1)
                {
                    x/=2;
                    Update(x);
                }
            }
            else
            {
                if (B>C) swap(B,C);
                t=0;
                ans=WORK(1,B+524287,C+524287);
                if (ans<0) printf("%d
    ",ans); else
                {
                    work(1,B+524287,C+524287);
                    printf("%d
    ",ans);
                }
            }
        }
        return 0;
    }
    折花枝,恨花枝,准拟花开人共卮,开时人去时。 怕相思,已相思,轮到相思没处辞,眉间露一丝。
  • 相关阅读:
    运算符与优先级
    数据类型
    c++基础
    有关进制
    函数二——递归
    字符串与随机数
    C语言第一课
    Linux-Shell
    Linux入门
    文本处理三剑客命令初探
  • 原文地址:https://www.cnblogs.com/L-Memory/p/6792554.html
Copyright © 2011-2022 走看看