社区讨论

求助 NOIP 编译器

学术版参与者 9已保存回复 26

讨论操作

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

当前回复
24 条
当前快照
1 份
快照标识符
@mii4v7qm
此快照首次捕获于
2025/11/28 08:37
3 个月前
此快照最后确认于
2025/11/29 13:30
3 个月前
查看原帖
目前我遇到过三个有关编译器的问题,想问问在 NOIP 上会不会出现。
  1. 以下代码以 C++14 (GCC 9) 编译时,输入 1,会输出 1 0
CPP
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=1000005;
ll n;
bool ac[N];
int main(){
  cin>>n;
  for(ll i = 1; i <= n; i++) {
    ac[i]=(((n - i + 1) % 2) == 0);
  }
  cout << ac[n] << " " << (((n-n+1)%2)==0) << "\n";
  return 0;
}
所以有如下问题:
  • 为什么输出会是 1 0
  • 这种错误如何避免?
  • NOIP 考场上可能会出现以上问题吗?
  1. 在 AT_abc330_f 中,以下代码在 atcoder 以 C++ 20 (gcc 12.2) 运行时会超时,而加上排序代码可以 AC;如果选择 C++ 17 (Clang 16.0.6) 则无论如何均能 AC。
CPP
#include<bits/stdc++.h>
#define int long long
#define endl '\n'
typedef long long ll;
using namespace std;
const int N = 2e5 + 5;
int n,k,a[2][N];
inline int cal(int type,int x,int t){
	int ans = 0;
	for(int i = 1;i <= n;i++){
		if(a[type][i] <= x)ans += x - a[type][i];
		if(a[type][i] >= x + t)ans += a[type][i] - x - t;
	}
	return ans;
}
inline int calc(int type,int t){
	int l = 0,r = INT_MAX - t;
	while(r - l > 2){
		int mid1 = l + (r - l) / 3,mid2 = r - (r - l) / 3;
		if(cal(type,mid1,t) <= cal(type,mid2,t))r = mid2;
		else l = mid1;
	}
	int ans = LLONG_MAX;
	for(int i = l;i <= r;i++)ans = min(ans,cal(type,i,t));
	return ans;
}
inline bool check(int t){
	return calc(0,t) + calc(1,t) <= k;
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin >> n >> k;
	for(int i = 1;i <= n;i++)cin >> a[0][i] >> a[1][i];
	//sort(a[0] + 1,a[0] + n + 1),sort(a[1] + 1,a[1] + n + 1);
  // ^^^^^^ 上面是排序代码 ^^^^^^
	int l = -1,r = INT_MAX;
	while(r - l > 1){
		int mid = (l + r) / 2;
		if(check(mid))r = mid;
		else l = mid;
	}
	cout << r;
}
所以有如下问题:
  • NOIP 考场是使用 gcc 还是 clang?
  • 为什么会出现以上问题?
  • 如何避免?
  1. https://www.luogu.com.cn/discuss/1202048 即下面的评论。
所以有同样的问题:
  • 为什么会出现以上现象?
  • 如何避免?
感谢帮忙回复的 OIer 们。祝你们 NOIP rp++。
不接受 AI 回复。因为我已经问过了。

回复

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

正在加载回复...