[CCPC2020绵阳H] Hide and Seek - 计数
Description
二维格点平面上有两个点,给定这两个点各自离原点的曼哈顿距离以及两点之间的曼哈顿距离,问这两个点有多少种可能的位置 pair。
Solution
设原点为 A,并且 (AB le AC),则合法情况讨论如下(基本想法就是固定一个点数另一个点的个数)
(AB=0) 时
(AC,BC) | (ans) |
---|---|
(AC=BC=0) | (1) |
(AC=BC>0) | (4AC) |
(AB eq 0) 时
(BC) | (ans) |
---|---|
(AC-AB) | (4(AB+1)(BC+1)-4) |
((AC-AB,AC+AB) s.t. ((BC-AC+AB) mod 2 =0)) | (2(AB-1)+2 imes frac 1 2 (BC-AC+AB+2)=4(AB+AC+BC)) |
(AC+AB) | (4(AB+1)(AC+1)-4) |
#include <bits/stdc++.h>
using namespace std;
#define int long long
int cid = 0;
void solve()
{
int d01, d02, d12;
cin >> d01 >> d02 >> d12;
if (d01 > d02)
swap(d01, d02);
++cid;
cout << "Case #" << cid << ": ";
if (d01 == 0)
{
if (d02 == d12)
{
if (d02 > 0)
cout << 4 * d02 << endl;
else
cout << 1 << endl;
}
else
{
cout << 0 << endl;
}
}
else
{
if (d12 == 0)
{
if (d01 == d02)
cout << 4 * d01 << endl;
else
cout << 0 << endl;
}
else if (d12 < d02 - d01)
{
cout << 0 << endl;
}
else if (d12 == d02 - d01)
{
cout << 4 * (d12 + d01 * (d12 + 1)) << endl;
}
else if (d12 == d02 + d01)
{
cout << 4 * (d02 + d01 * (d02 + 1)) << endl;
}
else if (d12 > d02 + d01)
{
cout << 0 << endl;
}
else
{
if ((d12 - d02 + d01) & 1)
cout << 0 << endl;
else
cout << 4 * (d01 + d02 + d12) << endl;
}
}
}
signed main()
{
ios::sync_with_stdio(false);
int t;
cin >> t;
while (t--)
solve();
}