牛客挑战赛60 B题数据有锅

#include<bits/stdc++.h>
#define pii pair<int,int>
#define fi first
#define sc second
#define pb push_back
#define ll long long
#define trav(v,x) for(auto v:x)
#define all(x) (x).begin(), (x).end()
#define VI vector<int>
#define VLL vector<ll>
#define pll pair<ll, ll>
#define double long double
//#define int long long
using namespace std;

#ifdef LOCAL
void debug_out(){cerr << endl;}
template<typename Head, typename... Tail>
void debug_out(Head H, Tail... T)
{
	cerr << " " << to_string(H);
	debug_out(T...);
}
#define debug(...) cerr << "[" << #__VA_ARGS__ << "]:", debug_out(__VA_ARGS__)
#else
#define debug(...) 42
#endif

const int N = 2050;
const int inf = 1e9;
//const ll inf = 1e18;
const ll mod = 998244353;//1e9 + 7;

int n, m, k;

int vis[N][N];
pii a[N * N];

void sol()
{
	cin >> n >> m >> k;
	n <<= 1, m <<= 1;
	for(int i = 0; i <= n; i++)
		for(int j = 0; j<= m; j++)
			vis[i][j] = 0;
	for(int i = 1; i <= k; i++)
		cin >> a[i].fi >> a[i].sc;
	k = min(k, 3000);
	for(int i = 1; i <= k; i++)
		a[i].fi <<= 1, a[i].sc <<= 1;
	for(int i = 1; i <= k; i++)
	{
		for(int j = i + 1; j <= k; j++)
		{
			++vis[(a[i].fi + a[j].fi) / 2][(a[i].sc + a[j].sc) / 2];
		}
	}
	for(int i = 1; i <= n; i++)
	{
		for(int j = 1; j <= m; j++)
		{
			if(vis[i][j] >= 2)
			{
				cout << "YES ";
				cout << fixed << setprecision(1) << 1.0 * i / 2 << ' ' << 1.0 * j / 2 << '\n';
				return;
			}
		}
	}
	cout << "NO" << '\n';
}

signed main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	int tt;
	cin >> tt;
	while(tt--)
		sol();
}

spj有问题,上面这个做法如果在得到最早可行的解直接break出来会判对,但是这样最后扫一遍的写法就会判错(有些是答案的点被判成不是答案了)。
直接break:(AC)
#include<bits/stdc++.h>
#define pii pair<int,int>
#define fi first
#define sc second
#define pb push_back
#define ll long long
#define trav(v,x) for(auto v:x)
#define all(x) (x).begin(), (x).end()
#define VI vector<int>
#define VLL vector<ll>
#define pll pair<ll, ll>
#define double long double
//#define int long long
using namespace std;

#ifdef LOCAL
void debug_out(){cerr << endl;}
template<typename Head, typename... Tail>
void debug_out(Head H, Tail... T)
{
	cerr << " " << to_string(H);
	debug_out(T...);
}
#define debug(...) cerr << "[" << #__VA_ARGS__ << "]:", debug_out(__VA_ARGS__)
#else
#define debug(...) 42
#endif

const int N = 2050;
const int inf = 1e9;
//const ll inf = 1e18;
const ll mod = 998244353;//1e9 + 7;

int n, m, k;

int vis[N][N];
pii a[N * N];

void sol()
{
	cin >> n >> m >> k;
	n <<= 1, m <<= 1;
	for(int i = 0; i <= n; i++)
		for(int j = 0; j<= m; j++)
			vis[i][j] = 0;
	for(int i = 1; i <= k; i++)
		cin >> a[i].fi >> a[i].sc;
	k = min(k, 3000);
	for(int i = 1; i <= k; i++)
		a[i].fi <<= 1, a[i].sc <<= 1;
    int x = 0, y = 0;
	for(int i = 1; i <= k; i++)
	{
		for(int j = i + 1; j <= k; j++)
		{
			++vis[(a[i].fi + a[j].fi) / 2][(a[i].sc + a[j].sc) / 2];
			x = (a[i].fi + a[j].fi) / 2;
			y = (a[i].sc + a[j].sc) / 2;
			if(vis[x][y] > 1)
			{
				break;
			}
		}
		if(vis[x][y] > 1)
			break;
	}
	for(int i = 1; i <= n; i++)
	{
		for(int j = 1; j <= m; j++)
		{
			if(vis[i][j] >= 2)
			{
				cout << "YES ";
				cout << fixed << setprecision(1) << 1.0 * i / 2 << ' ' << 1.0 * j / 2 << '\n';
				return;
			}
		}
	}
	cout << "NO" << '\n';
}

signed main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	int tt;
	cin >> tt;
	while(tt--)
		sol();
}
出题人谢罪
全部评论
确实是锅了。应该是只有在一种情况下 SPJ 会锅,而这种情况点数多的时候很少,恰好标程和所有验题人的代码都能过掉这种情况。 这道题并不是我出的,但是 SPJ 是我写的,先磕个头() 现在已经修了,对您以及其他遇到这个问题的选手带来不好的比赛体验感到非常抱歉。
2 回复
分享
发布于 2022-05-14 04:17
题是我出的,十分抱歉对您以及其他遇到这个问题的选手造成的困扰。 因为最开始写SPJ时没有注意到两个塔会重复的情况所以用了bool数组。 但是因为造数据的时候没有和写SPJ的人商议好所以造了两个塔位置重复的情况导致了错误,现在SPJ已经修复了。
点赞 回复
分享
发布于 2022-05-14 09:27
联易融
校招火热招聘中
官网直投
和你同一种解法 只能得90分 我以为是我的问题🤬🤬🤬🤬🤬
点赞 回复
分享
发布于 2022-05-14 20:00

相关推荐

头像
不愿透露姓名的神秘牛友
03-13 10:56
点赞 评论 收藏
转发
5 收藏 评论
分享
牛客网
牛客企业服务