社区讨论

关于使用了vector在洛谷评测机上RE而在本地测试毫无问题的情况

P1083[NOIP 2012 提高组] 借教室参与者 3已保存回复 19

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
19 条
当前快照
1 份
快照标识符
@m266kdcr
此快照首次捕获于
2024/10/12 21:16
去年
此快照最后确认于
2025/11/04 23:56
4 个月前
查看原帖
先说问题:本题我使用的主要思路是二分+差分区间修改,每一次都从上一次的列举到的地方 修改/还原。数组全部使用vector存储。在本地测试毫无问题,提交……喜提RE
本机测试:(测试点6) 环境:macOS 12.7.6; gcc version 14.2.0 (Homebrew GCC 14.2.0); 无O2优化
报了访问了访问了无法访问的内存空间与超出预期行为的错。(就离谱
代码:
C
#include <iostream>
#include <vector>
using namespace std;

struct INFO
{
    int start, end;
    long long n;
};
int n, m, last;
vector<long long> a, temp;
vector<INFO> order;

bool check(int now)
{
    if (last < now)
    {
        for (int i = last+1 ; i <= now ; i++)
        {
            temp[order[i].start] -= order[i].n;
            temp[order[i].end + 1] += order[i].n;
        }
        last = now;
    }
    else if (last > now)
    {
        for (int i = last ; i >= now+1 ; i--)
        {
            temp[order[i].start] += order[i].n;
            temp[order[i].end + 1] -= order[i].n;
        }
        last = now;
    }
    long long __tmp = 0;
    for (int i = 1 ; i <= n ; i++)
    {
        __tmp += temp[i];
        if (__tmp < 0)
            return true;
    }
    return false;
}
void solve()
{
    last = 0;
    int left = 1, right = m+1;
    while (left < right)
    {
        int mid = (left + right) >> 1;
        if (check(mid) == true)
            right = mid;
        else
            left = mid+1;
    }
    if (left > m)
        cout << 0 << endl;
    else
        cout << -1 << endl
             << left << endl;
    return;
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);

    cin >> n >> m;
    a.reserve(n + 1); temp.reserve(n + 1);
    a[0] = 0;
    order.reserve(m + 2);
    for (int i = 1 ; i <= n ; i++)
    {
        cin >> a[i];
        temp[i] = a[i] - a[i-1];
    }
    for (int i = 1 ; i <= m ; i++)
        cin >> order[i].n >> order[i].start >> order[i].end;
    solve();
    return 0;
}
后来拿静态数组改了就过了)

回复

19 条回复,欢迎继续交流。

正在加载回复...