惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

W
WeLiveSecurity
Jina AI
Jina AI
博客园 - 司徒正美
雷峰网
雷峰网
宝玉的分享
宝玉的分享
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园_首页
WordPress大学
WordPress大学
Google DeepMind News
Google DeepMind News
GbyAI
GbyAI
MyScale Blog
MyScale Blog
Apple Machine Learning Research
Apple Machine Learning Research
美团技术团队
I
InfoQ
博客园 - Franky
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
博客园 - 叶小钗
阮一峰的网络日志
阮一峰的网络日志
Cyberwarzone
Cyberwarzone
C
CXSECURITY Database RSS Feed - CXSecurity.com
S
Schneier on Security
P
Privacy & Cybersecurity Law Blog
T
Threatpost
Cloudbric
Cloudbric
D
Docker
M
MIT News - Artificial intelligence
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Vercel News
Vercel News
Martin Fowler
Martin Fowler
J
Java Code Geeks
AWS News Blog
AWS News Blog
The Cloudflare Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
L
Lohrmann on Cybersecurity
Hacker News: Ask HN
Hacker News: Ask HN
Last Week in AI
Last Week in AI
S
Security @ Cisco Blogs
Help Net Security
Help Net Security
C
Cisco Blogs
V
V2EX
博客园 - 【当耐特】
I
Intezer
爱范儿
爱范儿
F
Fortinet All Blogs
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
P
Privacy International News Feed
IT之家
IT之家
L
LINUX DO - 最新话题
B
Blog RSS Feed
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO

Shiroha白羽的博客

Golang 踩坑 —— interface 为参数的时候传 nil 指针 Codeforces Round 924 (Div. 2) Codeforces Round 923 (Div. 3) Codeforces Round 922 (Div. 2) Codeforces Round 921 (Div. 2) Educational Codeforces Round 161 (Rated for Div. 2) Codeforces Round 920 (Div. 3) Codeforces Round 919 (Div. 2) Hello 2024 Good Bye 2023 Codeforces Round 918 (Div. 4) 个人备份的常用 macOS 清理命令 Codeforces Round 917 (Div. 2) Pinely Round 3 (Div. 1 + Div. 2) Educational Codeforces Round 160 (Rated for Div. 2) Codeforces Round 915 (Div. 2) Codeforces Round 914 (Div. 2) Codeforces Round 913 (Div. 3) Educational Codeforces Round 159 (Rated for Div. 2) Codeforces Round 912 (Div. 2) Codeforces Round 911 (Div. 2) CodeTON Round 7 (Div. 1 + Div. 2, Rated, Prizes!) Educational Codeforces Round 158 (Rated for Div. 2) Codeforces Round 910 (Div. 2) Codeforces Round 909 (Div. 3) Codeforces Round 908 (Div. 2) Educational Codeforces Round 157 (Rated for Div. 2) C++自定义的字面量 Codeforces Round 907 (Div. 2) Codeforces Round 916 (Div. 3) 关于 LRU map 的一些灵感 2023 杭州站 ICPC 现场赛 反复横跳的 Clang-Tidy(cert-dcl21-cpp) Codeforces Round 906 (Div. 2) 一段奇怪的 CPP 代码 Codeforces Round 905 (Div. 3) Codeforces Round 904 (Div. 2) Codeforces Round 903 (Div. 3) Educational Codeforces Round 156 (Rated for Div. 2) Codeforces Round 902 (Div. 2, based on COMPFEST 15 - Final Round) Codeforces Round 901 (Div. 2) Codeforces Round 900 (Div. 3) Codeforces Round 899 (Div. 2) Educational Codeforces Round#155 (Div. 2) Codeforces Round 898 (Div. 4) CodeTON Round 6 (Div. 2) Codeforces Round 897 (Div. 2) Codeforces Round 896 (Div. 2) Codeforces Round 887 (Div. 2) Codeforces Round 895 (Div. 3) 左值-右值-将亡值 blog.mauve.icu Pinely Round 2 (Div. 1 + Div. 2) Harbour.Space Scholarship Contest 2023-2024 (Div. 1 + Div. 2) Codeforces Round 894 (Div. 3) Codeforces Round 888 (Div. 3) Educational Codeforces Round#153 (Div. 2) Codeforces Round 893 (Div. 2) OTPAUTH,两步验证中的通用协议 Codeforces Round 892 (Div. 2) Codeforces Round 891 (Div. 3) Codeforces Round 890 (Div. 2) Educational Codeforces Round#152 (Div. 2) blog.mauve.icu Java Script 的 null 和 undefined 随想 记一次 SQL LEFT JOIN 没有得到预期结果的错误 Codeforces Round#789(Div. 2) GCC/G++ 预编译头性能优化 使用 Junit5 和 Mockito 实现 SpringBoot 的单元测试最优美的解决方案 centOS 防火墙 docker-compse 的问题 C++ 语言实现动态变化的线程池 Codeforces Round#744 (Div. 3) 计算机图形学 Windows 通过网络访问 WSL2 原生 JavaScript 实现图片裁剪 面试复习(计算机图形学) 面试复习(算法) Codeforces Round#706(Div. 2)-Let's Go Hiking 面试复习(Java) 面试复习(Git) 面试复习(Linux) 面试复习(数据库) 面试复习(计算机网络) 面试复习(操作系统) 面试复习(C++) Codeforces Round#699 (Div. 2) 清理 WSL2 的磁盘占用 Codeforces Round#697 (Div. 3) Windows 下的 NTFS 驱动器索引 BUG 计算机网络复习 记一次 Navicat 连接 MySQL 一直报认证错误(Access denied) 计算机网络实验复习 WSL1 使用 Docker 一直无法启动 我的ACM脚印 2020牛客暑期多校训练营(第三场)D-Points Construction Problem——构造 2020牛客暑期多校训练营(第三场)E-Two Matchings——复杂思维与简单dp 2020牛客暑期多校训练营(第二场)I-Interval——最大流转对偶图求最短路 Educational Codeforces Round 80 D. Minimax Problem——二分+二进制处理 Codeforces Round 606 E. Two Fairs——图论 Codeforces Round 612 (Div. 2) C. Garland——DP
Codeforces Round 925 (Div. 3)
Shiroha · 2024-04-06 · via Shiroha白羽的博客

A. Recovering a Small String

大致题意

有一个字符串,长度固定为 $3$ 个字母,将其的每个字母对应的字母下标相加的值已知,问字典序最小的字符串是多少

思路

简单题,从后往前考虑即可,后面的尽可能大就是前面尽可能小

AC code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void solve() {
int _;
cin >> _;
for (int tc = 0; tc < _; ++tc) {
int n;
cin >> n;
vector<int> str(3);
str[2] = min(26, n - 2);
n -= str[2];
str[1] = min(26, n - 1);
n -= str[1];
str[0] = n;
cout << (char)(str[0] + 'a' - 1) << (char)(str[1] + 'a' - 1) << (char)(str[2] + 'a' - 1) << endl;
}
}

B. Make Equal

大致题意

有 $n$ 个水壶,每次允许将前面的水壶里的一部分水倒入到后面的水壶,问是否可能使得所有水壶的水一样多

思路

记录一个中间值,从前往后遍历,超过平均值就把超出部分加到中间值上,反之则减去,只要中间值不出现负数即可

AC code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void solve() {
int _;
cin >> _;
for (int tc = 0; tc < _; ++tc) {
int n;
cin >> n;
vector<int> data(n);
for (auto &i: data) cin >> i;
int tar = 0;
for (const auto &i: data) tar += i;
tar /= n;
int last = 0;
bool flag = true;
for (const auto& i:data) {
last += i - tar;
if (last < 0) flag = false;
}
cout << (flag ? "YES" : "No") << endl;
}
}

C. Make Equal Again

大致题意

有一段数组,允许最多选择一段区间,把区间的数值变成一个任意值,问最少需要选择多少的区间才能让整个数组变成一样的值

思路

看看最左边的值和最右边的值即可,如果一样就抓中间的,如果不一样就尝试一下都变成最左边的值或者最右边的值即可

AC code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void solve() {
int _;
cin >> _;
for (int tc = 0; tc < _; ++tc) {
int n;
cin >> n;
vector<int> data(n);
for (auto &i: data) cin >> i;
// left
int l = 0, r = n - 1;
while (l < n && data[l] == data[0]) ++l;
while (r >= 0 && data[r] == data[n - 1]) -- r;
if (data[0] == data[n - 1]) cout << max(r - l + 1, 0) << endl;
else cout << min(n - l, r + 1) << endl;
}
}

D. Divisible Pairs

大致题意

已知一个数组,找出满足如下条件的 $i, j$ 对,问有多少对

  • $(a_i + a_j) \space mod \space x = 0$
  • $(a_i - a_j) \space mod \space y = 0$

思路

从取摸特点考虑,容易得出

$$a_i \space mod \space x + a_j \space mod \space x = x$$

$$a_i \space mod \space y = a_j \space mod \space y$$

所以只需要统计 $mod \space x$ 和 $mod \space y$ 的结果即可。我这里直接用了高位

AC code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#define int long long

void solve() {
int _;
cin >> _;
for (int tc = 0; tc < _; ++tc) {
int n, x, y;
cin >> n >> x >> y;
map<int, int> cnt;
int ans = 0;
for (int i = 0; i < n; ++i) {
int tmp;
cin >> tmp;
int a = tmp % x, b = tmp % y;
auto iter = cnt.find(a << 32 | b);
if (iter != cnt.end()) ans += iter->second;
++cnt[(a == 0 ? 0 : (x - a)) << 32 | b];
}
cout << ans << endl;
}
}

E. Anna and the Valentine’s Day Gift

大致题意

有一个数组,两个人博弈

  • A 每次允许将数组中的一个值,在 10 进制上做翻转,并清除掉前导 0
  • B 每次允许将数组的两个值在十进制上直接拼接在一块

问最终得到的唯一一个的数值和 $10^m$ 的大小关系是什么

思路

一个是要通过翻转来删除后缀 0,能够有效的减少最终数值的长度,而另外一个可以拼接把后缀 0 隐藏在数值内部,所以只需要考虑所有的后缀 0 长度即可

AC code

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
void solve() {
int _;
cin >> _;
for (int tc = 0; tc < _; ++tc) {
int n, m;
cin >> n >> m;
vector<int> data(n);
int tot = 0;
for (int i = 0; i < n; ++i) {
int tmp;
cin >> tmp;
for (int j = 1000000000, k = 9; j >= 1; j /= 10, --k)
if (tmp % j == 0) {
data[i] = k;
break;
}
for (int j = 1000000000, k = 10; j >= 1; j /= 10, --k)
if (tmp >= j) {
tot += k;
break;
}
}
sort(data.begin(), data.end(), greater<>());
for (int i = 0; i < n; i += 2) tot -= data[i];
cout << (tot > m ? "Sasha" : "Anna") << endl;
}
}

F. Chat Screenshots

大致题意

有一个未知的默认的初始的排列,现在给出 $k$ 个通过其演变来的数组,演变的方式是将原始数组中的某一个值提到最开头,其他值顺序不变

问这些数组是否来自同一个初始的排列

思路

放弃第一个值,直接拓扑即可,能拓扑就是成功

AC code

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
void solve() {
int _;
cin >> _;
for (int tc = 0; tc < _; ++tc) {
int n, k;
cin >> n >> k;
vector<vector<int>> data(k);
for (auto &v: data) {
v.resize(n);
for (auto &i: v) cin >> i;
}

if (k == 1) {
cout << "YES" << endl;
continue;
}

vector<set<int>> map(n);
for (const auto &v: data) for (int i = 2; i < n; ++i) map[v[i - 1] - 1].insert(v[i] - 1);

vector<int> deg(n);
for (const auto &v: map) for (const auto &i: v) ++deg[i];
queue<int> q;
int cnt = 0;
for (int i = 0; i < n; ++i) if (!deg[i]) q.push(i);
while (!q.empty()) {
auto cur = q.front();
q.pop();
++cnt;
for (const auto& i: map[cur]) if (!--deg[i]) q.push(i);
}
cout << (cnt == n ? "YES" : "NO") << endl;
}
}

G. One-Dimensional Puzzle

大致题意

有 4 种方块,现在需要把它们拼接在一行里,问有多少种排列方式

G

思路

显然,当不存在 1 和 2 的时候,同时仅存在 3 和 4 的时候,那么

  • 如果只有 3 或者 4,那么只有一种排法
  • 如果同时有 3 和 4,那么就没有排法

接下来要考虑的肯定是 1 和 2 至少其中一个有的情况。

也容易发现,3 和 4 本质上并不会改变接口的形状,只是增长了一些现有的结构罢了,所以容易得出,3 / 4 在是否能够排列出这件事上,不重要

而 1 和 2 不一样,前者会减少一个凹形,后者会减少一个凸形,而一个 1 只会引入两个凸形,如果恰好,2 的数量比 1 多两个,那么必然会导致无法组成一行

同理,1 比 2 多两个也会导致组成不了形状。实际上也很容易得出,一定上组成 1/2/1/2/1/2 这样的依次排列形状(先不考虑 3/4)

所以如果 1 和 2 一样多,那么就可以得到 1/2/1/2 这样的组合,同时也可以得到 2/1/2/1 这样的组合。
如果恰好差一个,那么必然是 1/2/1/2/1 或者 2/1/2/1/2 其中之一,显然此时分成了两种情况考虑

接下来看 3/4 的情况,实际上 3/4 就是往 1/2 组成的结构里插入即可,于是问题就回到了在 $n$ 个和盒子中放 $m$ 个苹果的问题,注意可以空箱子

即答案就是 $\begin{pmatrix} n + m - 1 \\ m - 1 \end{pmatrix}$

AC code

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
51
52
53
54
55
56
57
58
59
60
#define int long long

void solve() {
int _;
cin >> _;
for (int tc = 0; tc < _; ++tc) {
constexpr int mod = 998244353;
auto qp = [&](int a, int p) {
int res = 1;
while (p) {
if (p & 1) res = res * a % mod;
a = a * a % mod;
p >>= 1;
}
return res;
};
auto inv = [&](int v) { return qp(v, mod - 2); };
auto step = [&](int n) {
int res = 1;
for (int i = 2; i <= n; ++i) res = res * i % mod;
return res;
};
auto cal = [&](int n, int m) {
int a = step(n + m -1), b = step(m - 1), c = step(n);
a = a * inv(b) % mod;
a = a * inv(c) % mod;
return a;
};

int c1, c2, c3, c4;
cin >> c1 >> c2 >> c3 >> c4;
if (abs(c1 - c2) > 1 || (c1 == 0 && c2 == 0 && c3 != 0 && c4 != 0)) {
cout << 0 << endl;
continue;
}
if (c1 == 0 && c2 == 0) {
cout << 1 << endl;
continue;
}
int ans = 1;
int tmp = max(c1, c2);
if (c1 == c2) {
int ans1 = 1, ans2 = 1;
if (c3 != 0) {
ans1 = ans1 * cal(c3, tmp) % mod;
ans2 = ans2 * cal(c3, tmp + 1) % mod;
}
if (c4 != 0) {
ans2 = ans2 * cal(c4, tmp) % mod;
ans1 = ans1 * cal(c4, tmp + 1) % mod;
}
ans = (ans1 + ans2) % mod;
}
else {
if (c3 != 0) ans = ans * cal(c3, tmp) % mod;
if (c4 != 0) ans = ans * cal(c4, tmp) % mod;
}
cout << ans << endl;
}
}