今天打模拟赛,出题人造数据的时候没换行,导致一个大概 2^32 大小的数和一个 10^6 拼到了一起,导致出现了一个巨大的数,此时出现了两个神奇的事
int x;
scanf("%lld", &x);
assert(x < (1ll << 32))
同学 assert 的是
int a[N]; // 全局
scanf("%lld", &a[i]);
assert(a[i] < (1ll << 32))
结果第一个没事第二个RE
所以有哪位大神能解释一下任何一件事是为什么吗?thx
附:
// 读入挂掉 ver.
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int NR = 1.1e6 + 5;
int n, k, q, ex[NR], a[NR], lg[NR];
signed main() {
ios :: sync_with_stdio(false), cin.tie(0), cout.tie(0);
cin >> k >> q; n = (1 << k);
for (int i = 0; i < n; ++i) cin >> a[i], ex[i] = (i == 0 ? 0 : ex[i - 1]) + a[i];
lg[1] = 0;
for (int i = 2; i <= n; ++i) lg[i] = lg[i >> 1] + 1;
while (q --) {
int t, r, L, R = -1, ans = 0; cin >> t >> r;
while (r) {
L = R + 1, R = R + (1 << lg[r]);
int mi = L ^ ((t >> lg[r]) << lg[r]);
int mx = mi + (1 << lg[r]) - 1;
ans += ex[mx] - (mi == 0 ? 0 : ex[mi - 1]);
r -= (1 << lg[r]);
}
cout << ans << '\n';
}
return 0;
}
// 读入正确 ver.
#include<iostream>
#include<cstdio>
#include<cmath>
#define int long long
#define maxn 500005
using namespace std;
int k, q, a[2048580];
signed main() {
ios_base::sync_with_stdio(false);
cin >> k >> q;
int n = 1 << k;
for(int i = 0; i < n; i++) {
cin >> a[i];
//if(i > 0) a[i] += a[i - 1];
}
while(q--) {
int sum = 0;
int t, r;
cin >> t >> r;
for(int i = 0; i < r; i++) {
sum += a[t ^ i];
}
cout << sum << endl;
}
}
出题人 a[n] 与第一组 query 的 t 没换行,效果大概是
********** ****** -> *****************