为什么全局变量还会导致栈溢出
  • 板块学术版
  • 楼主SilverLi
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/11/8 22:15
  • 上次更新2024/11/8 22:59:54
查看原帖
为什么全局变量还会导致栈溢出
688783
SilverLi楼主2024/11/8 22:15

运行时 VSCode 提示 segmentation fault

但是我访问到的数只有 131072,而我数组大小有 400020

总内存占用大概 480MB,也不会 MLE

为什么会这样

代码中的 bit_2.in

bool ST;
#include <bits/stdc++.h>
#define ps putchar(' ')
#define pe putchar('\n')
#define int long long
#define ls p << 1
#define rs p << 1 | 1
#define mid ((l + r) >> 1)
using namespace std;
inline int read()
{
    int f = 0, ans = 0;
    char c = getchar();
    while (!isdigit(c))
        f |= c == '-', c = getchar();
    while (isdigit(c))
        ans = (ans << 3) + (ans << 1) + c - 48, c = getchar();
    return f ? -ans : ans;
}
void write(int x)
{
    if (x < 0)
        putchar('-'), x = -x;
    if (x > 9)
        write(x / 10);
    putchar(x % 10 + '0');
}
const int N = 1e5 + 5, M = N << 2, inf = (1ll << 31) - 1, mod = 998244353;
int n, m, a[N], pc[N];
struct tree
{
    // or and appear total multiple
    int o, an, ap, tot, mul;
} tmp[35], lt[35], init = {0, inf, -1, 0, 0};
inline tree pack(tree &l, tree &r) { return {l.o | r.o, l.an & r.an, l.ap != -1 ? l.ap : r.ap, l.tot + r.tot, l.mul | r.mul | l.ap != r.ap & l.ap != -1 & r.ap != -1}; }
struct Tree
{
    tree tr[M];
    void build(int l, int r, int p, int k)
    {
        if (l == r)
        {
            tr[p] = (pc[l] == k ? tree{a[l], a[l], a[l], 1, 0} : init);
            return;
        }
        build(l, mid, ls, k), build(mid + 1, r, rs, k);
        tr[p] = pack(tr[ls], tr[rs]);
    }
    tree ask(int l, int r, int s, int t, int p)
    {
        if (l >= s && r <= t)
            return tr[p];
        tree ans = {0, 0, -1};
        if (mid >= s)
            ans = ask(l, mid, s, t, ls);
        if (mid < t)
        {
            tree T = ask(mid + 1, r, s, t, rs);
            ans = (ans.tot == -1 ? T : pack(ans, T));
        }
        return ans;
    }
    inline void build(int k) { build(1, n, 1, k); }
    inline tree ask(int s, int t) { return ask(1, n, s, t, 1); }
} t[30];
bool ED;
signed main()
{
    freopen("bit_2.in", "r", stdin);
    freopen("bit.out", "w", stdout);
    n = read(), m = read();
    for (int i = 1; i <= n; ++i)
        pc[i] = __builtin_popcountll(a[i] = read());
    for (int i = 0; i < 31; ++i)
        t[i].build(i);
    lt[0] = init;
    while (m--)
    {
        int l = read(), r = read(), fl = 0;
        if (t[0].ask(l, r).tot > 1)
        {
            puts("YES");
            continue;
        }
        for (int i = 1; i <= 30; ++i)
            lt[i] = pack(lt[i - 1], tmp[i] = t[i].ask(l, r));
        tree rt = init;
        for (int i = 30; i; rt = pack(rt, tmp[i--]))
            if (!tmp[i].mul && tmp[i].tot)
                if ((tmp[i].tot == 1 &&
                     ((lt[i - 1].o | tmp[i].ap) == rt.an || lt[i - 1].o == (rt.an & tmp[i].ap))) ||
                    (tmp[i].tot != 1 && (lt[i - 1].o | tmp[i].ap) == (rt.an & tmp[i].ap)))
                {
                    fl = 1;
                    break;
                }
        puts(fl ? "YES" : "NO");
    }
    return 0;
}
2024/11/8 22:15
加载中...