关于ios::sync_with_stdio(false)的一些小问题

本文讨论了Linux与Windows平台之间换行符差异、保留字使用及内存管理规则引起的编程问题,特别是在代码在洛谷评测系统上运行失败的情况。通过示例代码分析,指出`ios::sync_with_stdio(false)`可能导致的问题,并提供了修正方案。
摘要由CSDN通过智能技术生成

常见“我在本地/xxOJ AC了、洛谷却不过”的原因

  • Linux中换行符是’\n’而Windows中是’\r\n’(多一个字符),有些数据在Windows中生成,而在洛谷评测机Linux环境下评测。这种情况在字符串输入中非常常见。
  • 评测系统建立在Linux下,可能由于使用了Linux的保留字而出现CE,但在Windows下正常。
  • Linux对内存的访问控制更为严格,因此在Windows上可能正常运行的无效指针或数组下标访问越界,在评测系统上无法运行。
  • 严重的内存泄露的问题很可能会引起系统的保护模块杀死你的进程。因此,凡是使用malloc(或calloc,realloc,new)分配而得的内存空间,请使用free(或delete)完全释放。

问题来源:p3372【模板】线段树 1
我发现注释掉ios::sync_with_stdio(false);就可以过了

一个很好的解释

过不了洛谷的代码:

#pragma warning(disable:4996)
#include<iostream>
#include<cstdio>
using namespace std;
#define ls(x) (x<<1)
#define rs(x) ((x<<1)|1)
typedef long long ll;
const int MAXN = 1e6 + 5;
ll n, m, arr[MAXN], tree[MAXN << 2], tag[MAXN << 2];

void push_up(ll p) {
	tree[p] = tree[ls(p)] + tree[rs(p)];
	return;
}
void build(ll p, ll l, ll r) {
	tag[p] = 0;
	if (l == r) {
		tree[p] = arr[l];
		return;
	}
	ll mid = ((l + r) >> 1);
	build(ls(p), l, mid);
	build(rs(p), mid + 1, r);
	push_up(p);
	return;
}
void f(ll p, ll l, ll r, ll k) {
	tag[p] += k;
	tree[p] += (r - l + 1) * k;
	return;
}
void push_down(ll p, ll l, ll r) {
	ll mid = ((l + r) >> 1);
	f(ls(p), l, mid, tag[p]);
	f(rs(p), mid + 1, r, tag[p]);
	tag[p] = 0;
	return;
}
void update(ll ul, ll ur, ll p, ll l, ll r, ll k) {
	if (ul <= l && ur >= r) {
		tree[p] += k * (r - l + 1);
		tag[p] += k;//标记是给下一层的用的
		return;
	}
	push_down(p, l, r);
	ll mid = (l + r) >> 1;
	if (ul <= mid)update(ul, ur, ls(p), l, mid, k);
	if (mid + 1 <= ur)update(ul, ur, rs(p), mid + 1, r, k);
	push_up(p);
	return;
}
ll query(ll ql, ll qr, ll p, ll l, ll r) {
	if (ql <= l && r <= qr) {
		return tree[p];
	}
	ll mid = ((l + r) >> 1), res = 0;
	push_down(p, l, r);
	if (ql <= mid)
		res += query(ql, qr, ls(p), l, mid);
	if (mid + 1 <= qr)
		res += query(ql, qr, rs(p), mid + 1, r);
	return res;
}
void Print(ll p, ll l, ll r) {
	printf("%lld %lld %lld :%lld  ", p, l, r, tree[p]);
	if (l == r)return;
	ll mid = ((l + r) >> 1);
	Print(ls(p), l, mid);
	Print(rs(p), mid + 1, r);
	return;
}

int main() {
	ios::sync_with_stdio(false);
#ifndef ONLINE_JUDGE
	freopen("in.txt", "r", stdin);
#endif
	cin >> n >> m;
	ll a, b, c, d, e;
	for (int i = 1; i <= n; i++) {
		scanf("%lld", &arr[i]);
	}
	build(1, 1, n);

	while (m--) {
		ll t = 0;
		scanf("%lld", &t);
		if (t == 1) {
			scanf("%lld %lld %lld", &a, &b, &c);
			update(a, b, 1, 1, n, c);
		}
		else {
			scanf("%lld %lld", &d, &e);
			printf("%lld\n", query(d, e, 1, 1, n));
		}
	}

	//Print(1, 1, n);
	return 0;
}

可以过的代码:

#pragma warning(disable:4996)
#include<iostream>
#include<cstdio>
using namespace std;
#define ls(x) (x<<1)
#define rs(x) ((x<<1)|1)
typedef long long ll;
const int MAXN = 1e6 + 5;
ll n, m, arr[MAXN], tree[MAXN << 2], tag[MAXN << 2];

void push_up(ll p) {
	tree[p] = tree[ls(p)] + tree[rs(p)];
	return;
}
void build(ll p, ll l, ll r) {
	tag[p] = 0;
	if (l == r) {
		tree[p] = arr[l];
		return;
	}
	ll mid = ((l + r) >> 1);
	build(ls(p), l, mid);
	build(rs(p), mid + 1, r);
	push_up(p);
	return;
}
void f(ll p, ll l, ll r, ll k) {
	tag[p] += k;
	tree[p] += (r - l + 1) * k;
	return;
}
void push_down(ll p, ll l, ll r) {
	ll mid = ((l + r) >> 1);
	f(ls(p), l, mid, tag[p]);
	f(rs(p), mid + 1, r, tag[p]);
	tag[p] = 0;
	return;
}
void update(ll ul, ll ur, ll p, ll l, ll r, ll k) {
	if (ul <= l && ur >= r) {
		tree[p] += k * (r - l + 1);
		tag[p] += k;//标记是给下一层的用的
		return;
	}
	push_down(p, l, r);
	ll mid = (l + r) >> 1;
	if (ul <= mid)update(ul, ur, ls(p), l, mid, k);
	if (mid + 1 <= ur)update(ul, ur, rs(p), mid + 1, r, k);
	push_up(p);
	return;
}
ll query(ll ql, ll qr, ll p, ll l, ll r) {
	if (ql <= l && r <= qr) {
		return tree[p];
	}
	ll mid = ((l + r) >> 1), res = 0;
	push_down(p, l, r);
	if (ql <= mid)
		res += query(ql, qr, ls(p), l, mid);
	if (mid + 1 <= qr)
		res += query(ql, qr, rs(p), mid + 1, r);
	return res;
}
void Print(ll p, ll l, ll r) {
	printf("%lld %lld %lld :%lld  ", p, l, r, tree[p]);
	if (l == r)return;
	ll mid = ((l + r) >> 1);
	Print(ls(p), l, mid);
	Print(rs(p), mid + 1, r);
	return;
}

int main() {
	//ios::sync_with_stdio(false);
#ifndef ONLINE_JUDGE
	freopen("in.txt", "r", stdin);
#endif
	cin >> n >> m;
	ll a, b, c, d, e;
	for (int i = 1; i <= n; i++) {
		scanf("%lld", &arr[i]);
	}
	build(1, 1, n);

	while (m--) {
		ll t = 0;
		scanf("%lld", &t);
		if (t == 1) {
			scanf("%lld %lld %lld", &a, &b, &c);
			update(a, b, 1, 1, n, c);
		}
		else {
			scanf("%lld %lld", &d, &e);
			printf("%lld\n", query(d, e, 1, 1, n));
		}
	}

	//Print(1, 1, n);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值