2020.7.20比赛总结

题目链接
感受:较上周相比能感觉出来有一点点的提升了(安慰自己 )。悟出一个道理:有些题啊,如果总是一味的依靠题解是永远得不到提升的,在所用算法在自己知识范围内时无论如何都不能看题解,就算想了很长时间都没想到,先放一天,第二天再去思考如果还没有突破,就去看题解。
我还有一个感觉啊,就是现在想问题没有了以前那种头绪很混乱的感觉了,感觉很微妙,说不出来,我觉得应该就和打游戏一样玩着玩着意识就提升了。现在我做1600左右难度的题能很快出了,大概就是div3 4题div2 3题的样子把。现在如果出现WA的话我不会很慌乱,先找是思路问题还是实现问题,就是那种方向很明确,以前的话可能WA一次整场比赛状态就不好了。(当然昨天那场披着div2皮的div1例外)。
总结:说了这么多废话还是要写一下这场训练赛的总结,我按cf上的比赛顺序说吧。A题很水,一个小结论。B题一个贪心,倒着遍历,不过看别人好多超时,应该是多写了一层循环吧。C题一个模拟,记得以前做过,问题不大。D题一开始没有,到了最后半小时我才看见改题了,那个结论我弄出来了,比赛中细节没处理好,WA了,赛后也是独立AC了。E题搜题解是一个状压dp,现学一下吧。F题是个树形dp。也需要现学一下。。

A题

题目大意:

给你一些边,让你构成一个最大的子树,使得他可以通过以下方式进行构造出来:给每个端点一个取值范围,若两个端点的取值范围有重合部分则两点之间有边相连。
待补。

B题

题目大意:

给你一个字符串,问这串里的“好字符串”有多少个。“好字符串”定义:这个子串中的每个字符都属于一个大于1的回文串,则这个串是好字符串。

思路:

双指针+思维结论。
一般这种题我都是先看样例(凭空想真的想不到。。。),得出以下几点:
1 如果这个子串中只有一种字符且大于1那么它肯定是回文串。
2 如果一个子串中两种类型的字符都有,都为1个时肯定不行。都大于1时无论如何每个字符都能属于一个回文串,所以好字符串。
3 有一个大于1另一个等于1,那么就要分情况了,如果那个1个的在另一个的中间插着(不是边上就行)肯定满足任意一个字符都属于一个回文串,满足条件。
4 如果那个1个的在边上,例如ABB那么以A为起点到下一个A出现为止的所有子串都不满足题意。(B的也同理)
这么多条件只有一种情况不满足题意,那么一个个找满足题意的就太难了。但是我们在高中开始就接触了一句话叫“正难则反",这道题也适用,首先算出所有子串的数量,减去单个字符的子串数量n。然后再找不满足题意得子串减去就好了。
不满足题意的子串可以这么找,每次找一个相邻字符不相等的位置,然后分别向左和向右扩展到相同字符的位置,然后减去这段长度。最后结果即为答案。
代码:

#include<cstdio>
#include<iostream>
#include<queue>
#include<map>
#include<cstring>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int inf=0x3f3f3f3f;
const int N=3e5+10;
char s[N];
int main()
{
    
    
    ll n;
    scanf("%lld%s",&n,(s+1));
    ll now=1,tot=(n+1)*n/2-n;
    while(now<=n)
    {
    
    
        while(s[now]==s[now+1]&&now<n) now++;
        if(now==n) break;
        ll left=now-1,right=now+2;
        while(s[left]==s[now]&&left>=1) left--;//最终结束位置s[left]!=s[now]
        while(s[right]==s[now+1]&&right<=n) right++;//s[right]!=s[now+1]
        tot-=now+1-(left+1);
        tot-=right-1-now;
        tot++;
        now++;
    }
    printf("%lld\n",tot);
    return 0;
}

C题

题目大意:

给你两个数x y(x>y),你每次可以选一个素数p然后让x减去任意次数的p,最后能否从x得到y。

思路:

水题。
首先我么能注意到2是素数,所以x-y是偶数的话肯定可以。然后还剩下x-y是奇数的情况,1时肯定不行。1不是素数。那么常规奇数分为素数和非素数,素数肯定也可以,非素数的话根据素数分解定理,它肯定存在一个素数因子,所以也可以。那么结论就是x-y等于1不行,其它都可以。算数基本定理——百度百科

D题

题目大意:

从h往下跳,每次不能跳超过2的高度,问最少花费多少能到达0处。可以进行以下操作:若你在x,可以按按钮让x-1的台子出来。也可以花费1改变任意一个台子的状态。

思路:

简单模拟题。不多说了,模拟整个过程即可注意细节。

E题

题目大意:

有一个字符串,你要用键盘打出这些字符,每次手指在键盘上移动花费1,当前键盘上的字符是未知的,问打出目标字符串最少花费是多少。
待补。

F题

题目大意:

在数轴右边有怪物,左边(包括0)全是陷阱,怪物掉进陷阱会死。你也可以用导弹打死怪物,打死x位置上的怪物时,左边怪物会被冲到pos-r处,右边会被冲到pos+r处。

思路:

贪心+模拟。
从小到大排个序再去重,之后从大到小轰这些怪物,然后记录一个向左移动距离len,每次放导弹就加一个r。然后遇到已经掉到陷阱里的怪物是直接break掉,因为已经排序,左边的都掉进去了。

猜你喜欢

转载自blog.csdn.net/amazingee/article/details/107470642