02 2024 档案
摘要:思路 这题的舍取我们可以分情况考虑: xxx 是叶子结点,删不删无所谓,都是 000; xxx 有一个儿子,果断删,保全它的所有子节点,共 sx−1s_x-1sx−1 个(其中 sxs_xsx 表示以 xxx 为根的子树下的节点个数); xxx 有两个儿子,只能舍一个保一个,保左儿子和保右儿子取
阅读全文
摘要:思路 一道暴力题。因为 t≤100t\le100t≤100,所以我们只要循环枚举 mmm 的最大值就行了。然后贪心,肯定是先把 mmm 加到最大再移动,除非不能整除了。加 mmm 需要 m−1m-1m−1 次,移动 xxx 需要 ⌈xm⌉\lceil\frac xm\rceil⌈mx⌉ 次,移动
阅读全文
摘要:思路 这题其实就是每次贪心从头读到尾,暂时不能读的就要等下一轮读,直到读完。如果有环就永远读不完。 然后就是拓扑排序板子。但是这题因为每次阅读必须递增,因此我们可以用 set 加上 lower_bound 代替 queue。 代码 # include <bits/stdc++.h> using na
阅读全文
摘要:思路 这题当然不能暴力建图,会超时。不难发现,a&b=0a\&b=0a&b=0(此处的 &\&& 指按位与)时,∀b∈¬a\forall b\in\neg a∀b∈¬a。于是我们只要枚举每个 ¬a\neg a¬a 的子集就行了。 代码 # include <bits/stdc++.h> using
阅读全文
摘要:思路 这道题中,原本是最短路的板子题,但因为有 sis_isi 的变化,所以我们不能直接普通使用最短路。然后你会发现 nnn 和 sis_isi 都很小,只有 100010001000,因此我们可以把 di→di,jd_i\to d_{i,j}di→di,j,其中 di,jd_{i,j}di
阅读全文
摘要:思路 题目中说了“至多一次操作”,所以只有左边连续一段和右边连续一段不可能被改。这时候分情况讨论: a1=a2=a3=⋯=ana_1=a_2=a_3=\dots=a_na1=a2=a3=⋯=an,答案是 000; a1=ana_1=a_na1=an,答案是 nnn 减去头尾的连续段; a
阅读全文
摘要:思路 我们首先要计算出 mid=∑ainmid=\frac{\sum a_i}nmid=n∑ai,因为这是我们的目标。由于 iii 必须 <j<j<j,所以我们可以从前往后贪心。如果 ai>mida_i>midai>mid,那就把多余的 ai−mida_i-midai−mid 单位的水倒到下
阅读全文
摘要:dijkstra 板子题。这题每个点就连两个边,然后就没有然后了。 代码 # include <bits/stdc++.h> using namespace std; typedef long long ll; typedef pair <int, int> pii; const ll inf =
阅读全文
摘要:简简单单记忆化搜索而已。在这题中,因为 数据大,不能直接用数组记忆化,所以我们可以用 map。 代码 # include <bits/stdc++.h> using namespace std; typedef long long ll; ll n; map <ll, ll> f; ll dfs (
阅读全文
摘要:思路 也是一个贪心题。可以枚举 1∼k1\sim k1∼k 的所有数,若此数在 aaa 和 bbb 中都未出现过,则一定无解了;若只在 aaa 中出现而不在 bbb 中出现,则说明不能用 bbb 里的数字,totbtotbtotb 加 111,只在 bbb 中出现同理。结束时,如果 totb>k2t
阅读全文
摘要:思路 这就是一个贪心题,若 ai=0a_i=0ai=0,则把 sis_isi 设为一个目前没有出现过的字符;否则就把 sis_isi 设为任意一个在此之前已经出现了 ai−1a_i-1ai−1 次的字符。但是数据范围太大,所以从 ai−1a_{i-1}ai−1 开始倒着枚举当然是不行的,因
阅读全文
摘要:思路 这题既然不关心大小写,所以我们可以把输入的字符串和要比较的字符串中的大写字母都转化成小写,再比较就行。 代码 # include <bits/stdc++.h> using namespace std; string a; int main () { cin >> a; for (int i
阅读全文