1005 老骥伏枥

Problem Description

2026 丙午马年,一位少年骑手报名参加马拉松骑行挑战赛。赛道上的打卡点以正整数编号 (1,2,3,)(1,2,3,\ldots),若两个打卡点的编号 i,ji,j 满足 popcount(ij)=1\operatorname{popcount}(i \oplus j)=1,则它们之间有一条长度为 11 的赛道。

少年从 11 号打卡点出发,目标是到达 nn 号打卡点。请你帮他算出最短路的长度。

其中 popcount(x)\operatorname{popcount}(x) 表示 xx 在二进制下 11 的个数,\oplus 表示按位异或。

Input

输入 TT1T51041 \le T \le 5 \cdot 10^4),表示数据组数。

接下来 TT 行,每行一个正整数 nn1n1091 \le n \le 10^9)。

Output

对于每组数据,输出一行一个整数,表示最短路的长度。

解题思路

判断x和1的二进制有多少位不相同就是答案

题解代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <bits/stdc++.h>
using namespace std;

const int inf = 0x3f3f3f3f;

void sol() {
int n; cin >> n;
int x = 1;
int cnt = 0;
for (int i =0; i <= 31; i++)
if (((x >> i) & 1) != ((n >> i) & 1))
cnt++;
cout << cnt << endl;
}

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

1003 马蹄疾

Problem Description

2026 丙午马年,全国马术锦标赛盛大开幕。一匹骏马要跑过 nn 个标记点,在第 ii 个标记点处,骑手会选择一种步法编码 aia_i(满足 0ai<2t0 \le a_i < 2^t)。

马匹跑过前 ii 个驿标后的奔势定义为前 ii 个步法编码的异或值:

pi=a1a2aip_i = a_1 \oplus a_2 \oplus \cdots \oplus a_i

一次奔跑的马力值是所有奔势的总和:

S=i=1npiS = \sum_{i=1}^{n} p_i

比赛裁判伯乐拿到了若干份参赛申请,每份申请声称自己的马匹在给定的 nntt 下能跑出马力值 SS。伯乐需要逐一审核——这样的奔跑是否存在?请你帮帮伯乐。

Input

本题有多组测试数据。输入 TT1T51041 \le T \le 5 \cdot 10^4),表示数据组数。

对于每组数据:

一行三个整数 n,t,Sn,t,S1n1051 \le n \le 10^51t301 \le t \le 300S10150 \le S \le 10^{15})。

Output

对于每组数据,输出一行 YesNo

解题思路

S最小可以是0,最大可以是n个二进制全部为1的数的和,判断一下就行。

题解代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <bits/stdc++.h>
using namespace std;

const int inf = 0x3f3f3f3f;
typedef long long ls;


void sol() {
ls n, t, s; cin >> n >> t >> s;
if (s >= 0 && s <= ((1LL << t) - 1) * n)
cout << "Yes" << endl;
else
cout << "No" << endl;
}

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

1002 驿站

Problem Description

2026 丙午马年,某快递公司运营着一张覆盖全国的物流网络,快递员马马不停蹄地在各驿站之间接力配送。

该网络共设有 nn 座驿站,编号为 1,2,,n1,2,\ldots,n,驿站之间由 mm 条单向运输线路相连。每座驿站的编号代表其安全等级——编号越大,途经该驿站包裹丢失的风险越高。

一条从驿站 11(总部)到驿站 ii 的运输路线 P=(v1,v2,,vk)P=(v_1,v_2,\ldots,v_k)(其中 v1=1v_1=1vk=iv_k=i)的风险值定义为途经所有驿站编号的最大值,即:

risk(P)=max1jkvj\operatorname{risk}(P)=\max_{1 \le j \le k} v_j

调度员需要为每座驿站规划最安全的配送路线。对于每个驿站 i{1,2,,n}i \in \{1,2,\ldots,n\},求从总部出发到达驿站 ii 的所有路线中风险值的最小值。若驿站 ii 无法从总部到达,输出 1-1

Input

本题有多组测试数据。输入 TT1T1031 \le T \le 10^3),表示数据组数。

对于每组数据(相邻两组数据间用一空行隔开):

第一行输入两个正整数 n,mn,m1n1051 \le n \le 10^51m2×1051 \le m \le 2 \times 10^5)。

接下来 mm 行,每行输入两个正整数 u,vu,v1u,vn1 \le u,v \le n),表示一条从驿站 uu 到驿站 vv 的单向驿道。图中可能存在重边和自环。

保证所有数据的 nn 的和不超过 10610^6mm 的和不超过 2×1062 \times 10^6

Output

对于每组数据:

输出一行 nn 个整数,第 ii 个整数表示从总部到驿站 ii 的最小风险值。若不可达,输出 1-1

题面解读

给定一个图,找1号点到每个点的路径,要求这条路径中的最大值最小,输出这个值。

解题思路

单源最短路问题的变种,用dijkstra的优先队列优化。

最短路是距离最短,这题是路径中最大值最小,那就让优先队列保存路径中的最大值,每次找到可以使得它最大值减小的路径就转移。

题解代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
typedef long long ls;
typedef unsigned long long uls;
typedef pair<int, int> PII;
const int N = 1e5 + 10;
const int INF = 0x3f3f3f3f;

void sol(){
vector<int> h[N];
vector<bool> vis(N, false);
vector<int> dis(N, INF);
int n, m; cin >> n >> m;
while (m--){
int u, v; cin >> u >> v;
h[u].push_back(v);
}
auto dijkstra = [&](){
priority_queue<PII, vector<PII>, greater<PII>> q;
dis[1] = 1;
q.push({1, 1});
while (!q.empty()){
int u = q.top().second;
q.pop();
if (vis[u])
continue;
vis[u] = true;
for (auto v : h[u])
if (max(v, dis[u]) < dis[v]){
dis[v] = max(v, dis[u]);
q.push({dis[v], v});
}
}
};
dijkstra();
for (int i = 1; i <= n; i++)
if (dis[i] != INF)
cout << dis[i] << ' ';
else
cout << -1 << ' ';
cout << endl;
}

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