灵异事件
  • 板块灌水区
  • 楼主Citnaris
  • 当前回复6
  • 已保存回复6
  • 发布时间2023/5/4 20:39
  • 上次更新2023/10/23 16:39:27
查看原帖
灵异事件
384498
Citnaris楼主2023/5/4 20:39

今天打模拟赛,出题人造数据的时候没换行,导致一个大概 2^32 大小的数和一个 10^6 拼到了一起,导致出现了一个巨大的数,此时出现了两个神奇的事

  • 出题人 assert 时读入用的是
int x; 
scanf("%lld", &x);
assert(x < (1ll << 32))

同学 assert 的是

int a[N]; // 全局

scanf("%lld", &a[i]);
assert(a[i] < (1ll << 32))

结果第一个没事第二个RE

  • 对于这个连起来的数,我们同学有人用的是 cin 有人 scanf,但是两种情况下都有人在错误输入下得到正确输出(?!),其他的人读的数就是错位了

所以有哪位大神能解释一下任何一件事是为什么吗?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 没换行,效果大概是

********** ****** -> *****************

2023/5/4 20:39
加载中...