社区讨论
玄学:Runtime Error - Aborted
学术版参与者 2已保存回复 30
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 29 条
- 当前快照
- 1 份
- 快照标识符
- @m4140z72
- 此快照首次捕获于
- 2024/11/28 17:26 去年
- 此快照最后确认于
- 2025/11/05 01:25 4 个月前
以下代码使用 GCC
-std=c++14 选项编译会导致 RE (本机 Segment Fault,OJ Aborted),而使用 -std=c++17 或者更高标准则不会出现问题;使用 Clang++ 无论是否开启 -std=c++14 都不会出现问题这究竟是我代码的问题还是编译器/标准库的问题?
代码如下,大致思路是实现动态开点权值线段树,包括单点修改和区间查询操作
CPP#include <iostream>
#include <vector>
using namespace std;
const int N = 1e9;
const int MAXN = 101; // 55pts
class maxSegTree
{
struct Node
{
int val;
int ls, rs;
Node() : val(0), ls(-1), rs(-1) {};
};
vector<Node> pool;
int head;
void push_up(int now)
{
pool[now].val = 0;
if (pool[now].ls != -1)
pool[now].val = max(pool[now].val, pool[pool[now].ls].val);
if (pool[now].rs != -1)
pool[now].val = max(pool[now].val, pool[pool[now].rs].val);
}
int modify(int idx, int val, int s, int t, int now)
{
if (now == -1)
{
pool.push_back(Node());
now = pool.size() - 1;
}
if (s == t)
{
pool[now].val = val;
return now;
}
int mid = (s + t) / 2;
if (idx <= mid)
pool[now].ls = modify(idx, val, s, mid, pool[now].ls);
else
pool[now].rs = modify(idx, val, mid + 1, t, pool[now].rs);
push_up(now);
return now;
}
int query(int l, int r, int s, int t, int now)
{
if (now == -1)
return 0;
if (s >= l && t <= r)
return pool[now].val;
int mid = (s + t) / 2;
int ans = 0;
if (l <= mid)
ans = max(ans, query(l, r, s, mid, pool[now].ls));
if (r > mid)
ans = max(ans, query(l, r, mid + 1, t, pool[now].rs));
return ans;
}
public:
// void modify(int idx, int val) { head = modify(idx, val, 1, N, head); }
void modify(int idx, int val) { head = modify(idx, val, 1, N, head); }
int query(int l, int r) { return query(l, r, 1, N, head); }
maxSegTree() : head(-1) {}
};
maxSegTree f[MAXN][2];
// f[0]: b[i] > b[i - 1], f[1]: b[i] < b[i - 1]
// f[1] <- f[0]: query max[v + 1, N] + 1
// f[0] <- f[1]: query max[1, v - 1] + 1
void solve(int n, int q)
{
while (q--)
{
int op;
cin >> op;
if (op == 1)
{
int l, r, x;
cin >> l >> r >> x;
for (int i = l; i <= r; ++i)
{
const int v1 = f[i][0].query(x + 1, N);
const int v2 = f[i][1].query(1, x - 1);
f[i][1].modify(x, v1 + 1);
f[i][0].modify(x, v2 + 1);
}
}
if (op == 2)
{
int t;
cin >> t;
cout << max(f[t][0].query(1, N), f[t][1].query(1, N)) << "\n";
}
}
}
回复
共 30 条回复,欢迎继续交流。
正在加载回复...