无法在Codeforces上调试686E的代码

时间:2016-07-11 04:58:58

标签: c++ debugging

我一直在尝试this问题,但没有成功。

问题是“给定平面中的一组源点,找到一个点(具有整数坐标),以便最小化到任何源点的最大曼哈顿距离”。

我在Google Code Jam上找到very similar problem,我使用他们的竞赛分析成功解决了这个问题。

我的方法与Code Jam问题的解决方案非常相似,适用于CodeForces问题中的整数约束。

据我从错误的测试用例的细节中可以看出,我的答案“不够好”,即存在一个较小的最大距离点。

不幸的是,我无法链接我的代码(2个链接限制),所以我在下面复制粘贴。

#include <iostream>
#include <iomanip>
#include <cmath>

#define setMax(a, b) (a<b)?(a=b):0
#define setMin(a, b) (a>b)?(a=b):0

using namespace std;

const int N = (int)1e5;
const long long LL_UP = (long long)9e18;

struct point
{
    long long x, y, z;

}s[N];

bool doesAnswerExist(long long c, int n, point &ans)
{
    long long A, B, C, D, E, F, G, H;
    A = C = E = G = -LL_UP;
    B = D = F = H = LL_UP;

    for (int i = 0; i < n; ++i)
    {
        setMax(A, s[i].x + s[i].y + s[i].z - c);
        setMin(B, s[i].x + s[i].y + s[i].z + c);
        setMax(C, -s[i].x + s[i].y + s[i].z - c);
        setMin(D, -s[i].x + s[i].y + s[i].z + c);
        setMax(E, s[i].x - s[i].y + s[i].z - c);
        setMin(F, s[i].x - s[i].y + s[i].z + c);
        setMax(G, s[i].x + s[i].y - s[i].z - c);
        setMin(H, s[i].x + s[i].y - s[i].z + c);
    }

    if (A > B or C > D or E > F or G > H)
        return false;

    long long xMin = ceil(max((G+E)/2.0, (A-D)/2.0)), xMax = floor(min((B-C)/2.0, (H+F)/2.0));

    if (xMin > xMax)
        return false;

    for (ans.x = xMin; ans.x <= xMax; ++ans.x)
    {
        long long ypz = max(A-ans.x, C+ans.x), ymz = max(ans.x-F, G-ans.x);

        if ((long long)fabs(ymz + ypz) % 2 == 1)
        {
            if (ypz < min(B-ans.x, D+ans.x))
                ++ypz;

            else if (ymz < min(ans.x-E, H-ans.x))
                ++ymz;

            else
                continue;
        }

        ans.y = (ypz+ymz)/2;
        ans.z = (ypz-ymz)/2;
        return true;
    }

    return false;
}

void binSearch(long long l, long long r, int n, point &ans)
{
    if (l == r)
    {
        doesAnswerExist(l, n, ans);
        return;
    }

    long long mid = (l+r)/2;

    if (doesAnswerExist(mid, n, ans))
        binSearch(l, mid, n, ans);

    else
        binSearch(mid+1, r, n, ans);
}

int main()
{
    ios_base::sync_with_stdio(false);

    int t, n;

    cin >> t;

    while (t--)
    {
        cin >> n;

        for (int i = 0; i < n; ++i)
            cin >> s[i].x >> s[i].y >> s[i].z;

        point ans;
        binSearch(0, (long long)3e18, n, ans);

        cout << ans.x << ' ' << ans.y << ' ' << ans.z << '\n';
    }

    return 0;
}

1 个答案:

答案 0 :(得分:0)

我自己解决了这个问题,我必须说,这是我做过的最愚蠢的错误。

我愚蠢地假设将整数除以2将得到底数(x / 2),但正如我刚刚发现的那样,对于负数而言并非如此,因为int(-2.5)将给出-2和不是-3。