思路讲解
我的总体思路就是把问题拆成3个背包,而且因为不同食物不会含有多种vitamin,所以背包之间不会有干扰。
然后枚举前两个背包的大小(第三个背包就是总背包-1-2),得出最优组合,输出答案即可
AC代码
AC
https://atcoder.jp/contests/abc390/submissions/62196209
1 |
|
我的总体思路就是把问题拆成3个背包,而且因为不同食物不会含有多种vitamin,所以背包之间不会有干扰。
然后枚举前两个背包的大小(第三个背包就是总背包-1-2),得出最优组合,输出答案即可
AC
https://atcoder.jp/contests/abc390/submissions/62196209
1 | #include <bits/stdc++.h> |
2025牛客WC3-C-智乃的Notepad(Easy version) 的结论如下:
字典树每次扩充新节点++ans;最后ans就是字典树的节点数量(严格来说是不包含idx=0的节点的数量),当然此时不是答案,根据观察,所有的节点都需要被回退,只有最长的字符串不需要回退,所以答案就是
1 | cout<<ans*2-maxLen<<'\n'; |
除了最长字符串上的节点,全部都要打一遍,然后再删除掉,故ans*2,然后最长的字符串不需要回退,-maxLen
那么既然就是要求区间快速查询,我们只要查出这个区间最长的字符串长度是多少 & 这个区间生成的Trie树节点数 就行了。
当然前者简单,用树状数组只会树状数组(ST表,线段树,单调栈……)就行了(前置知识:用树状数组实现RMQ)
后者怎么搞那?(思路参考以下讲解)
然后还有一个点可能没有点破,就是其实你可以在插入完第R个字符串之后马上处理以第R个为结尾的询问,因为你提前知道所有的询问是吧(又不是强制在线),这也算是一种离线的trick吧
既然我们知道了可以这么玩就好了,我们只需要优先考虑后面插入的字符串就好了,因为后面要的一定要,区间是必定包含后面的,前面要的只有在包含前面是才加入节点数。
具体实现也可以用树状数组维护前缀和来做。
AC
https://ac.nowcoder.com/acm/contest/view-submission?submissionId=75252163
1 | #include <bits/stdc++.h> |
因为用了两个树状数组,这个名字起的也比较重,前面好几次搞混了。还有N,T搞混了,que数组长度是T,我以为是N了,总之最后有惊无险,都搞定了
这题代码挺简单的,这个代码看起来长,实际上全部是快读模版和一些宏定义
然后我们来讲一讲,实际上就是字典树建树过程。
然后其实就是字典树每次扩充新节点++ans;最后ans就是字典树的节点数量(严格来说是不包含idx=0的节点的数量),当然此时不是答案,根据观察,所有的节点都需要被回退,只有最长的字符串不需要回退,所以答案就是
1 | cout<<ans*2-maxLen<<'\n'; |
除了最长字符串上的节点,全部都要打一遍,然后再删除掉,故ans*2,然后最长的字符串不需要回退,-maxLen
https://ac.nowcoder.com/acm/contest/view-submission?submissionId=75219752
1 | #include <bits/stdc++.h> |
https://ac.nowcoder.com/acm/contest/view-submission?submissionId=75219747
段错误
字典树一般要开10倍空间。

交换速度你可以理解为这两个球想幽灵一样,直接穿过,没有碰撞(因为我们不在乎是哪个球撞的,我们只在乎碰撞次数)
套了一个树状数组查逆序对的板子
不要用unordered_map以及set用于离散化,常数有一点大。
可以用unique,sort,以及lower_bound实现离散化,常数比较小,写也不是很难写
还有要求误差小于eps可以这么写,不用直接写<eps,快一点(卡常卡常)
1 | while (r-l>(eps*l)) { |
双指针就是可以从暴力优化,原本是双层循环,但其实第二次循环有必要从1开始吗?显然不是对吧。
然后注意notMeet可能还是需要lower_bound()一下
1 | FOR(i, 1, idx){ |
双指针肯定比树状数组稍微快一点
https://ac.nowcoder.com/acm/contest/view-submission?submissionId=75219410
1 | #include <bits/stdc++.h> |
各种卡常技巧一起上,终于是过了用树状数组。
https://ac.nowcoder.com/acm/contest/view-submission?submissionId=75217361
1 | #include <bits/stdc++.h> |
https://ac.nowcoder.com/acm/contest/view-submission?submissionId=75218329
双指针有问题是因为这个
1 | FOR(i, 1, idx){ |
1 | hack数据 |
这个程序看起来没问题,但其实有点问题,就是88理应得到0,但这个程序会给出错误判断,说明notMeet的逻辑有问题,应该使用二分查找更为保险
树状数组超时,MLE
1 | #include <bits/stdc++.h> |
想这样枚举是会超时的,我们发现其实元素加入顺序其实不重要,重要的是这个元素加入到了哪个组中
1 | for (int i=1; i<=N; ++i) { |
所以说只需要减少枚举维度就行了(不再枚举元素)
1 | for(int j=1;j<=groups+1;++j){ |
AC
https://atcoder.jp/contests/abc390/submissions/62115363
1 | #include <iostream> |
TLE
https://atcoder.jp/contests/abc390/submissions/62115165
1 | #include <iostream> |