0%

思路讲解

也是体验了一把学霸的感觉,一编译就本地AC,然后交上去就一次AC了。

比那个D题还要顺,只能说我的字符串哈希还是比较熟练的。

这个如果Hx里有比该前缀更小的单元,直接放弃。

1
2
3
4
5
6
7
8
FOR(i,0,SZ(s)-1){
hax+=s[i]*Base[i];
// 如果Hx里有比该前缀更小的单元,直接放弃
if(Hx.find(hax)!=Hx.end()){
needOp=false;
break;
}
}

AC代码

https://atcoder.jp/contests/abc403/submissions/65404782

心路历程(WA,TLE,MLE……)

思路讲解

这道题目,可以通过转化,变为给你一张链图,问你如何删去权重之和最少的点,使这张链图完全不联通。

image

这个问题可以通过dp解决。

1
2
3
4
5
6
7
8
dp[0][0]=0,dp[0][1]=ls.front();
FOR(j,1,SZ(ls)-1){
// 当前带着的=之前不带的 之前带着砍掉之前带着的
dp[j][0]=min({dp[j-1][1],dp[j-1][0]+ls[j-1]});
// 当前不带= 之前带着砍掉当前 之前不带砍掉当前
dp[j][1]=min(dp[j-1][0]+ls[j],dp[j-1][1]+ls[j]);
}
ans+=min(dp[SZ(ls)-1][0],dp[SZ(ls)-1][1]);

AC代码

https://atcoder.jp/contests/abc403/submissions/65403420

心路历程(WA,TLE,MLE……)

WA,最后发现是循环范围出了问题

思路讲解

就是要注意到,如果一段连续的相同的数字是不会影响结果的,因此需要把他们缩减。

AC代码

心路历程(WA,TLE,MLE……)

https://codeforces.com/contest/2108/submission/317973413

1
2
3
4
1
3
11 10 10

思路讲解

首先贪心的,我们在每个位置上总归想跳的最远,且在每个位置上都跳的最远,得到的一定是最少跳跃次数的。

那么这个每个位置上通过加一个字母能够一次跳到的最远位置怎么得到的那?其实就是所有合法字母中上一次出现的位置最远的字母的位置(如果有一个合法字母前面没出现过,那我们就认为他直接跳出去结束了)。

1
2
3
4
5
6
7
8
9
10
11
12
ROF(i,N-1,0){
FOR(j,0,K-1){
if(Pos[j].empty()){
JumpFar[i]=N;
JumpCh[i][j]=N;
}else{
JumpFar[i]=max(Pos[j].back(),JumpFar[i]);
JumpCh[i][j]=Pos[j].back();
}
}
Pos[S[i]-'a'].pb(i);
}

然后知道了在这个位置上最远能跳多远,那么我们知道最多要跳多少次那?可以通过记忆化搜索。

1
2
3
4
5
6
7
8
9
ll dfs(ll x){
if(x>=N) return 0;
if(dp[x]!=0) return dp[x];
return dfs(JumpFar[x])+1;
}

ROF(i,N-1,0){
dp[i]=dfs(i);
}

最后这个串需要用多少位原串需要跳跃处理,否则会 TLETLE,最坏 O(NQ)O(NQ) 时间复杂度。

AC代码

https://codeforces.com/contest/2104/submission/317799371

心路历程(WA,TLE,MLE……)

https://codeforces.com/contest/2104/submission/317796467

对比对部分没有优化。

思路讲解

其实思路还是很简单的,就是符合要求的一列数字,数字总和最小的就是 2357112,3,5,7,11,…

这样的一串素数数列。

证明?那么我们假设其中一个数字可以减去1,首先2不能-1(出现了1),那么其他的数字-1也不能(被2除)。

得证。

AC代码

https://codeforces.com/contest/2104/submission/317754416

心路历程(WA,TLE,MLE……)