在二维平面上是否有一个整数坐标点到和的欧几里得距离都是?
如果存在符合条件的点,输出Yes
;否则,输出No
。
输出 | ||||
---|---|---|---|---|
Yes |
||||
No |
||||
Yes |
我们首先要知道,什么是“距离为”。设(均为整数),则有:
所以,对于这个点,有如下距离为的点(其他点都类似):
所以,我们对找到所有的距离为的点,并对计算与的距离即可。
#include <cstdio>
using namespace std;
using LL = long long;
const int d[8] = {-1, 1, 2, 2, 1, -1, -2, -2};
inline LL sqr2(const LL& x, const LL& y)
{
return x * x + y * y;
}
int main()
{
LL x1, y1, x2, y2;
scanf("%lld%lld%lld%lld", &x1, &y1, &x2, &y2);
x1 -= x2, y1 -= y2;
for(int i=0; i<8; i++)
if(sqr2(x1 + d[i], y1 + d[(i + 2) & 7]) == 5)
{
puts("Yes");
return 0;
}
puts("No");
return 0;
}
水题警告
Takahashi和Aoki在玩一个游戏。游戏过程如下:
当两人都按最优策略游戏时,谁会赢得比赛?
输出胜者的名字,即Takahashi
或Aoki
。
输出 | ||||
---|---|---|---|---|
Aoki |
||||
Takahashi |
||||
Aoki |
要解决这道题,首先要知道什么是“最优策略”。
显然,当Takahashi选择的加上任意的都不是质数时,Takahashi胜利;
否则,当任意的加上某一个都得到质数时,Aoki胜利。
因为数据范围较小,我们可以暴力枚举所有和,质数判断耗时可以忽略不计。因此,总时间复杂度约为。
P.S. 不可思议,运行时间居然是..(本来以为至少也有的..)
#include <cstdio>
using namespace std;
inline bool isprime(int x)
{
for(int t=__builtin_sqrt(x), i=2; i<=t; i++)
if(x % i == 0)
return false;
return true;
}
int main()
{
int a, b, c, d;
scanf("%d%d%d%d", &a, &b, &c, &d);
for(int i=a; i<=b; i++)
{
int j = c;
for(; j<=d; j++)
if(isprime(i + j))
break;
if(j > d) { puts("Takahashi"); return 0; }
}
puts("Aoki");
return 0;
}
有一个由个节点(节点,..,节点)组成的树(根节点为节点)。
第条边连接节点和。节点有一个数值。
给定个询问,第个询问由组成:
输出行。第行应包含对第个询问的回答。
略,请自行前往AtCoder查看
我们首先发现题面中,。于是我们对每个节点分别存储以它为根的子树中前的数值。
于是,我们按照拓扑序(或直接),执行如下操作:
排序建议用priority_queue
,时间复杂度或(直接排序)。
示例代码实现方式为DFS + priority_queue
,用时
#include <cstdio>
#include <queue>
#define maxn 100005
using namespace std;
int x[maxn];
vector<int> G[maxn], dp[maxn];
void dfs(int v, int par)
{
priority_queue<int, vector<int>, greater<int>> q;
q.push(x[v]);
for(int u: G[v])
if(u != par)
{
dfs(u, v);
for(int val: dp[u])
{
q.push(val);
if(q.size() > 20) q.pop();
}
}
while(!q.empty())
{
dp[v].push_back(q.top());
q.pop();
}
}
int main()
{
int n, q;
scanf("%d%d", &n, &q);
for(int i=0; i<n; i++)
scanf("%d", x + i);
for(int i=1; i<n; i++)
{
int a, b;
scanf("%d%d", &a, &b);
G[--a].push_back(--b);
G[b].push_back(a);
}
dfs(0, -1);
while(q--)
{
int v, k;
scanf("%d%d", &v, &k);
const auto& d = dp[--v];
printf("%d\n", d[d.size() - k]);
}
return 0;
}