01 2021 档案
摘要:主要思路:二进制拆分。 先将 $m$ 进行二进制拆分。 注意金币总数有限,也就是说拆分后可能会多出来一组。多出来的这组如果不是 $2^n$ 就不需要考虑了,因为不会和前面的重复。 接下来考虑重复的情况,如 $m=23$ ,可以拆为 $1 2 4 8 8$ 。 于是我们直接把俩 $8$ 变成 $7$
阅读全文
摘要:题目要求同时查询最大最小值,所以选择用 multiset 。 感觉没啥好说的,但是刚开始没想到这东西...... #include<bits/stdc++.h> using namespace std; multiset<int> st; int n,m; int main() { scanf("%
阅读全文
摘要:贪心。 每次取最小的两堆合并,最后即为正确答案。(我也不会证明/wq) 所以说主要问题就是怎么找最小的两堆。 由于中间不断有插入和删除,所以用优先队列。 ~~扯不下去了~~ 直接看代码吧。 #include<bits/stdc++.h> using namespace std; priority_q
阅读全文
摘要:~~本来看着挺简单结果写完了怎么也调不对调了半个小时~~ 很明显直接用优先队列直接模拟就好了。(没啥好说的)~~但是就是写不对~~ 刚开始发现记不住 priority 怎么写,后来发现自己记不住重载运算符怎么写,再后来发现忘了优先队列怎么用... 就当是复习一遍这堆东西了吧。 #include<bi
阅读全文
摘要:~~第一次知道树形dp还能状压~~ 题面挺长的,大概就是选包含五种矿藏的子树使代价最小。 因为一共只有五种,所以把可以五种拿到与没拿到状态压缩一下,然后就是正常树形 dp 了。 话说我刚开始把 inf 赋成了 2e9 害得自己找了好长时间重写一遍才发现/dk #include<bits/stdc++
阅读全文
摘要:写了一个多小时,本来觉得 bfs 能过然后码了好久发现不会确定顺序,又重新写了一遍 dfs /kk ~~好吧其实是因为我记得上次做这题的时候写的是 bfs~~ 设 $f[i][0]$ 表示以 $i$ 为根的子树当 $i$ 不去时的最大快乐值, $f[i][1]$ 表示以 $i$ 为根的子树当 $i$
阅读全文