刚学OI 1e-114 s 的萌新求助简单最大子段和问题
查看原帖
刚学OI 1e-114 s 的萌新求助简单最大子段和问题
455490
Sharpsmile楼主2023/8/19 11:50

RT,写的是那个猫树好像。

根据别人的博客瞎胡的写法,不知道对不对,讨论区的hack和样例都能过啊qwq

求助求助求助

//#include<bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <math.h>
#include <algorithm>
#include <istream>
#include <string>
#include <queue>
#include <deque>
#include <stack>
#include <set>
#include <string.h>
#include <map>
#include <unordered_map>
#include <sstream>
#include <bitset>
using namespace std;
#define endl "\n"
#define int long long
//#define double long double
#define p1(x) (x).first
#define p2(x) (x).second
#define pii pair<int,int>
#define lc(x) ((x)<<1)
#define rc(x) ((x)<<1|1)
//#pragma optimize(3)
//#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
const int LG=18;
const int N=262144;
int p[LG+2][N+10],s[LG+2][N+10];
int pANS[LG+2][N+10],sANS[LG+2][N+10];
int pw[LG+2][N+10],sw[LG+2][N+10];
int pmx[LG+2][N+10],smx[LG+2][N+10];
int a[N+10];
int n;
int lg[N+10];

inline void bd(int k=0,int l=0,int r=N-1){
    if(l==r){
        p[k][l]=max(0ll,a[l]);
        s[k][l]=max(0ll,a[l]);
        pANS[k][l]=sANS[k][l]=max(0ll,a[l]);
        pw[k][l]=sw[k][l]=a[l];
        pmx[k][l]=smx[k][l]=a[l];
        return ;
    }
    int mid=l+r>>1;
    bd(k+1,l,mid);
    bd(k+1,mid+1,r);
    for(int i=l;i<=mid;i++)
        p[k][i]=p[k+1][i],
        pw[k][i]=pw[k+1][i],
        pmx[k][i]=pmx[k+1][i],
        pANS[k][i]=pANS[k+1][i];
    for(int i=mid+1;i<=r;i++)
        p[k][i]=max(pw[k+1][mid]+p[k+1][i],p[k][i-1]),
        pw[k][i]=pw[k+1][mid]+pw[k+1][i],
        pmx[k][i]=max(pmx[k+1][mid],pmx[k+1][i]),
        pANS[k][i]=max(pANS[k][i-1],p[k+1][i]+s[k+1][l]);
    
    for(int i=r;i>=mid+1;i--)
        s[k][i]=s[k+1][i],
        sw[k][i]=sw[k+1][i],
        smx[k][i]=smx[k+1][i],
        sANS[k][i]=sANS[k+1][i];
    for(int i=mid;i>=l;i--)
        s[k][i]=max(sw[k+1][mid+1]+s[k+1][i],s[k][i+1]),
        sw[k][i]=sw[k+1][i]+sw[k+1][mid+1],
        smx[k][i]=max(smx[k+1][mid+1],smx[k+1][i]),
        sANS[k][i]=max(sANS[k][i+1],s[k+1][i]+p[k+1][r]);
}
inline int g(int l,int r){
    if(l==r)return a[l];
    int k=LG-lg[l^r];
    int MX=max(smx[k][l],pmx[k][r]);
    if(MX<=0)return MX;
    return max(max(sANS[k][l],pANS[k][r]),s[k][l]+p[k][r]);
}
inline void slv(){
    lg[0]=-1;
    for(int i=1;i<N;i++)
        lg[i]=lg[i>>1]+1;
    cin>>n;
    memset(a,-0x3f,sizeof(a));
    for(int i=0;i<n;i++)
        cin>>a[i];
    bd();
    int q;
    cin>>q;
    while(q--){
        int l,r;
        cin>>l>>r;
        l--,r--;
        cout<<g(l,r)<<endl;
    }
}

inline void MT(){long long _;cin>>_;while(_--)slv();}
const char* SS="/Users/noip2019/Downloads/problem_2612/ex_rectangle4.in";
signed main(){ios::sync_with_stdio(0);
//     freopen(SS,"r",stdin);
//    MT();
    slv();
    return 0;
}


2023/8/19 11:50
加载中...