求助为何CE
查看原帖
求助为何CE
375811
loip楼主2025/6/22 11:00

编译信息

编译失败

Nothing is compiled: OUTPUT exceeds.

看不懂啥意思好像和空间有关,难道是编译时间太久了?

maxn = 7.5e5 就会报CE

maxn = 7.5e4 就不会

最大的数组st表21n int,sgt 10n long long,应该不会炸空间啊,但为何把动态开点线段树换掉就可过

#include<bits/stdc++.h>
#define ll long long
#define F(i, l, r) for(int i = l; i <= r; ++i)
#define UF(i, l, r) for(int i = r; i >= l; --i)
#define inf 0x3f3f3f3f
#define inff 0x3f3f3f3f3f3f3f3f
#define pii pair<int,int>
using namespace std;
const int maxn = 7.5e5 + 100;
int N, Q;
ll h[maxn] = {0};
ll ans[maxn];
struct ST{
    #define gett(x, y) (h[(x)] >= h[(y)] ? (x) : (y))
    int n, c[maxn][21];
    void init(int n1){
        n = n1; F(i, 1, n) c[i][0] = i;
        F(k, 1, __lg(n)) F(i, 1, n-(1<<k)+1)
            c[i][k] = gett(c[i][k-1], c[i + (1<<(k-1))][k-1]);
    }
    int ask(int l, int r){
        int k = __lg(r-l+1);
        return gett(c[l][k], c[r-(1<<k)+1][k]);
    }
}st;
vector<pair<int, pii>> qv[maxn];

int son[maxn][2] = {0};
int buildtr(){
    stack<int> sta;
    F(i, 1, N){
        int u = 0;
        while(!sta.empty() && h[i] > h[sta.top()])
            son[sta.top()][1] = u, u = sta.top(), sta.pop();
        son[i][0] = u;
        sta.push(i);
    }
    int u = 0;
    while(!sta.empty())
        son[sta.top()][1] = u, u = sta.top(), sta.pop();
    return u;
}

struct SegTree{
    int rt = 0, tot = 1;
    struct Node{ int lc = 0, rc = 0; ll val = 0, lz1 = 0, lz2 = 0; } tr[maxn*2];
    #define lc(id) tr[id].lc
    #define rc(id) tr[id].rc
    void pushup(int id){;}
    void pushdown(int id, int l, int r){
        if(id == 0) return;
        if(tr[id].lz1 == 0){
            if(l == r)
                tr[id].val += tr[id].lz2;
            else
                tr[lc(id)].lz2 += tr[id].lz2,
                tr[rc(id)].lz2 += tr[id].lz2;
            tr[id].lz2 = 0; return;
        }
        if(l == r){
            tr[id].val = tr[id].lz1 + tr[id].lz2;
            tr[id].lz1 = tr[id].lz2 = 0; return;
        }
        if(lc(id) == 0) lc(id) = ++tot;
        if(rc(id) == 0) rc(id) = ++tot;
        tr[lc(id)].lz1 = tr[rc(id)].lz1 = tr[id].lz1;
        int mid = (l + r) >> 1;
        tr[lc(id)].lz2 = tr[id].lz2;
        tr[rc(id)].lz2 = tr[id].lz2 + (mid-l+1) * tr[id].lz1;
        tr[id].lz1 = tr[id].lz2 = 0;
    }
    ll ask(int id, int l, int r, int qw){
        if(id == 0) return 0;
        pushdown(id, l, r);
        if(l == qw && qw == r) return tr[id].val;
        int mid = (l + r) >> 1;
        if(qw <= mid) return ask(lc(id), l, mid, qw);
        else return ask(rc(id), mid+1, r, qw);
    }
    void add(int& id, int l, int r, int ql, int qr, ll qv1, int qv2){
        if(id == 0) id = ++tot;
        pushdown(id, l, r);
        if(ql <= l && r <= qr){
            tr[id].lz1 = qv1; tr[id].lz2 = qv2 + (l-ql) * qv1;
            return;
        }
        int mid = (l + r) >> 1;
        if(ql <= mid) add(lc(id), l, mid, ql, qr, qv1, qv2);
        if(mid+1 <= qr) add(rc(id), mid+1, r, ql, qr, qv1, qv2);
    }
    int EFfind1(int l, int r, ll a1, ll d, bool flag){
        int l1 = l, r1 = r;
        l--, r++;
        while(l + 1 < r){
            int mid = (l + r) >> 1;
            ll amid = flag ? a1 + (mid-l1) * d : a1 + (r1-mid) * d;
            if(amid < ask(rt, 1, N, mid)) flag ? l = mid : r = mid;
            else flag ? r = mid : l = mid;
        }
        return flag ? l : r;
    }
}sgt1, sgt2;
#define addf(ql, qr, qv1, qv2) sgt1.add(sgt1.rt, 1, N, (ql), (qr), (qv2), (qv1))
#define addg(ql, qr, qv1, qv2) sgt2.add(sgt2.rt, 1, N, (ql), (qr), (qv2), (qv1))
#define f1(x) sgt1.ask(sgt1.rt, 1, N, (x))
#define g2(x) sgt2.ask(sgt2.rt, 1, N, (x))
void dfs(int u, int l, int r){
    if(u == 0) return;
    dfs(son[u][0], l, u-1); dfs(son[u][1], u+1, r);
    for(auto it : qv[u]){
        int id = it.first, ql = it.second.first, qr = it.second.second;
        ans[id] = min(g2(ql) + (qr-u+1) * h[u], f1(qr) + (u+1-ql) * h[u]);
    }
    ll fl = l <= u-1 ? f1(u-1) : 0;
    addf(u, u, fl+h[u], 0);
    if(u+1 <= r){
        addf(u+1, r, h[u]*(u-l+1), 0);
        int r1 = sgt1.EFfind1(u+1, r, 2*h[u]+fl, h[u], 1);
        if(u+1 <= r1) addf(u+1, r1, h[u]+fl, h[u]);
    }
    ll gr = u+1 <= r ? g2(u+1) : 0;
    addg(u, u, gr+h[u], 0);
    if(l <= u-1){
        addg(l, u-1, h[u]*(r-u+1), 0);
        int l1 = sgt2.EFfind1(l, u-1, 2*h[u]+gr, h[u], 0);
        if(l1 <= u-1) addg(l1, u-1, (u-l1+2)*h[u]+gr, -h[u]);
    }
}
int main(){
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    cin >> N >> Q;
    F(i, 1, N) cin >> h[i];
    st.init(N);
    F(i, 1, Q){
        int l, r; cin >> l >> r; l++, r++;
        qv[st.ask(l, r)].push_back({i, {l, r}});
    }
    dfs(buildtr(), 1, N);
    F(i, 1, Q) cout << ans[i] << '\n';
    return 0;
}
2025/6/22 11:00
加载中...