首页 > 其他分享 >CF--783--D

CF--783--D

时间:2022-12-19 13:22:23浏览次数:63  
标签:ch 783 -- max sum tr CF int

D. Optimal Partition

/*
if(sum[i]-sum[j]>0) f[i]=max(f[j]-j)+i;
if(sum[i]==sum[j])  f[i]=max(f[j]);
if(sum[i]-sum[j]<0) f[i]=max(f[j]+j)-i;
所以f[i] 的更新是只和f[j]有关系的
存三棵树的关系也就可以了
至于sum[i],sum[j]之间的相对关系,离散化处理一下子就可以了
然后根据s

果然,还是需要先暴力找思路,然后再对思路进行优化
屡试不爽
*/
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int M=5e5+5;
const int inf=1e17;
#define ul u<<1
#define ur u<<1|1

inline int read(){
    int x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
    return x*f;
}

struct Tree {
    int l,r,v[3];
}tr[M<<2];

void pu(int u) {
    for(int i=0;i<=2;i++)
        tr[u].v[i]=max(tr[ul].v[i],tr[ur].v[i]);
}

void build(int u,int l,int r) {
    tr[u]={l,r,{-inf,-inf,-inf}};
    if(l==r)return ;
    int mid=l+r>>1;
    build(ul,l,mid);
    build(ur,mid+1,r);
    pu(u);
}

void up(int u,int x,int v0,int v1,int v2) {
    if(tr[u].l==x&&tr[u].r==x) {
        tr[u].v[0]=max(tr[u].v[0],v0);
        tr[u].v[1]=max(tr[u].v[1],v1);
        tr[u].v[2]=max(tr[u].v[2],v2);
        return ;
    }
    if(tr[u].l>x||tr[u].r<x)return ;
    up(ul,x,v0,v1,v2);
    up(ur,x,v0,v1,v2);
    pu(u);
}

int query(int u,int l,int r,int k) {
    if(tr[u].l>=l&&tr[u].r<=r)return tr[u].v[k];
    if(tr[u].l>r||tr[u].r<l)return -inf;
    return max(query(ul,l,r,k),query(ur,l,r,k));
}

int a[M],b[M],sum[M];
int f[M];


signed main() {
    int TT=read();
    while(TT--) {
        int n=read();
        vector<int>v;
        for(int i=1;i<=n;i++) {
            a[i]=read();
            f[i]=-inf;
            sum[i]=sum[i-1]+a[i];
            v.push_back(sum[i]);
        }
        build(1,1,n+1);
        v.push_back(0);
        sort(v.begin(),v.end());
        v.erase(unique(v.begin(),v.end()),v.end());
        for(int i=0;i<=n;i++)
            b[i]=lower_bound(v.begin(),v.end(),sum[i])-v.begin()+1;
        up(1,b[0],0,0,0);
        for(int i=1;i<=n;i++) {
            f[i]=max(f[i],query(1,1,b[i]-1,0)+i);
            f[i]=max(f[i],query(1,b[i],b[i],1));
            f[i]=max(f[i],query(1,b[i]+1,n+1,2)-i);
            up(1,b[i],f[i]-i,f[i],f[i]+i);
        }
        cout<<f[n]<<endl;
    }
    return 0;
}

标签:ch,783,--,max,sum,tr,CF,int
From: https://www.cnblogs.com/basicecho/p/16991917.html

相关文章

  • 详解如何将卫星影像或者航拍正射影像添加到Auto CAD中?
    在工程设计施工过程中,我们需要将项目现场的影像数据导入CAD,将卫星影像按1:1等比例且带坐标导入CAD中,作为设计参考底图来辅助我们的设计绘图。这里我们分享一个免费的工具-......
  • Calibre 6.10 发布,功能强大的开源电子书工具
    Calibre6.10发布,功能强大的开源电子书工具来源:OSCHINA编辑: Alias_Travis2022-12-1807:15:22 1Calibre开源项目是Calibre官方出的电子书管理工具......
  • Atom 项目仓库正式归档,进入只读模式
    Atom项目仓库正式归档,进入只读模式来源:OSCHINA编辑: 局2022-12-1908:46:00 2GitHub正式归档了Atom项目的代码仓库,目前已进入只读模式。Atom是......
  • Kotlin 异步框架 Ktor 2023 路线图公布
    Kotlin异步框架Ktor2023路线图公布来源:OSCHINA编辑: Alias_Travis2022-12-1907:58:46 0Ktor是一个异步框架,用于创建微服务、Web应用等。从头到......
  • OCaml 5.0.0 正式发布
    OCaml5.0.0正式发布来源:OSCHINA编辑: 局2022-12-1808:02:45 0OCaml是一个函数式、指令式、模块化、面向对象的通用的编程语言,源自ML(MetaLangua......
  • 54、内核模块管理及编译安装
    /proc目录:内核把自己内部状态信息及统计信息,以及可配置参数通过proc为文件系统加以输出/proc/sys设置sysctl-wpath.to.parameter=value查看或设定此目录中诸多参数,如sysc......
  • When to use next() and return next() in Node.js
    Somepeoplealwayswritereturnnext()istoensurethattheexecutionstopsaftertriggeringthecallback.Ifyoudon'tdoit,yourisktriggeringthecallback......
  • Python__07--input
    1input()描述:input()函数是输入性函数,与print()函数类似,input()函数括号里的内容是会显示出来的,但不同在于,我们需要输入对应的内容,回车后才能继续运行。1.1测试代码......
  • Python__07--input
    1input()描述:input()函数是输入性函数,与print()函数类似,input()函数括号里的内容是会显示出来的,但不同在于,我们需要输入对应的内容,回车后才能继续运行。1.1测试代码......
  • Python__07--input
    1input()描述:input()函数是输入性函数,与print()函数类似,input()函数括号里的内容是会显示出来的,但不同在于,我们需要输入对应的内容,回车后才能继续运行。1.1测试代码......