思路讲解
好像和上面这道有点关系
还是需要用到三进制状态压缩dp
0表示这张牌在A手里,1表示这张牌在B手里,2表示这张牌在C手里
然后问题就回到了怎么样状态转移了
答案是不用管怎么转移,暴搜(记忆化搜索)就完了
注意理解题意
AC代码
1 |
|
心路历程(WA,TLE,MLE……)
注意,题目是说可以直接把自己的一张牌打出来,不用管桌子上的牌,只是拿牌只能拿桌子上大的牌
好像和上面这道有点关系
还是需要用到三进制状态压缩dp
0表示这张牌在A手里,1表示这张牌在B手里,2表示这张牌在C手里
然后问题就回到了怎么样状态转移了
答案是不用管怎么转移,暴搜(记忆化搜索)就完了
注意理解题意
1 | #include <iostream> |
注意,题目是说可以直接把自己的一张牌打出来,不用管桌子上的牌,只是拿牌只能拿桌子上大的牌
前置知识:并查集,以及如何维护联通块数量和上下限
主要思路就是我们把颜色相同且连在一起的作为一个联通块,如果对这个联通块进行染色,就把根节点染一下颜色,然后看左界-1颜色和右界+1颜色,看看要不要合并。
至于数颜色数量嘛,需要用到维护的该联通块数量
1 | inline void changeColor(ll x,ll c){ |
https://atcoder.jp/contests/abc380/submissions/61033055
1 | #include <iostream> |
WA https://atcoder.jp/contests/abc380/submissions/61030202
原因是我们还要维护一个块的上界和下界,以确定他是否和其他联通块因为颜色相同而相连。
unionn的时候把Cnt加过去就行。
1 | inline ll findFa(ll x){ |
https://www.acwing.com/problem/content/submission/code_detail/38538368/
1 | #include <iostream> |
哈哈,找规律很难找,找不出来?不妨使用回溯思想,反过来找。
这个操作那其实就是一个倍增操作,我们反过来找我们的这个位置需要倍增几次才能到那?
知道了这个,只需要通过这个(需要倍增几次)%2 进行反转操作就行。
1 | #include <iostream> |
样例给的强,一次提交就过了
https://atcoder.jp/contests/abc380/submissions/60951665
其实调调了半天,尽量函数越少越好(用了一个指针优化掉了一个函数)。
总体我感觉没什么难的,就是写起来比较复杂
细节上的问题主要写在注释上,这里讲一下答题思路。
先把所有在应该放2位置的1换成2。(之前是没有这个步骤的,但好像导致策略不够优秀)
接着把所有在应该放2位置的0先换成1,再换成2
最后放一下1就可以了
https://codeforces.com/contest/2034/submission/297475528
1 | #include <iostream> |
WA1:
https://codeforces.com/contest/2034/submission/297451161
判断哪里应该是2,哪里应该是1的判断有点问题
WA2:
https://codeforces.com/contest/2034/submission/297454477
策略不够优,超过了最大允许操作次数