思路讲解
思路其实就是组合数生成惯用套路+深度控制
组合数生成其实就是从start开始,这样可以保证加入顺序都是从编号小的到编号大的,进而达到无视元素加入顺序的效果。
1 | void dfs(int dep,int start,ull sum){ |
当然,利用异或计算的性质,我们可以控制深度,枚举不选的,而不是枚举选的,以减少计算次数
1 | if(T>N-T){ |
AC代码
AC
https://atcoder.jp/contests/abc386/submissions/62216769
1 |
|
思路其实就是组合数生成惯用套路+深度控制
组合数生成其实就是从start开始,这样可以保证加入顺序都是从编号小的到编号大的,进而达到无视元素加入顺序的效果。
1 | void dfs(int dep,int start,ull sum){ |
当然,利用异或计算的性质,我们可以控制深度,枚举不选的,而不是枚举选的,以减少计算次数
1 | if(T>N-T){ |
AC
https://atcoder.jp/contests/abc386/submissions/62216769
1 | #include <bits/stdc++.h> |
如果红色块被涂黑了,所有被红线围住的块全部也要涂黑,所以说中间不能有一个白色的块

形式化的来说,B(x,y),那么不能有白块 ≤ x && ≤ y。
AC
https://atcoder.jp/contests/abc386/submissions/62215130
https://www.luogu.com.cn/record/200864278
1 | #include <bits/stdc++.h> |
如果出现样例结果评测机与本地结果不一致,大概率是空的情况处理有问题
还是要多防御性编程,不要相信lower_bound一定正确,避免其返回end()的情况
https://www.luogu.com.cn/article/5c0a5s3i

由上可知,只有让每行每列的和都为0才在所有情况下都有解。
所以说这种东西首先要确定在什么情况下是一定有解的,不能上来就做
https://codeforces.com/contest/2055/submission/303531727
1 | #include <iostream> |
我的总体思路就是把问题拆成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了,总之最后有惊无险,都搞定了