常见“我在本地/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;
}