Week2 训练赛总结
赛时情况
-
T1: 矩乘板子
-
T2:CF1555D Say No to Palindromes打了个暴力T了
-
T3:CF1117D Magic Gems 矩乘,递推式本来推对了,后来又改错了,最后又改回来了
-
T5: $\left \lfloor \frac{p}{n} \right \rfloor $ 不知道怎么处理
-
T6:不会
总结:矩阵的题见得太少了,递推式子不会推,总之: $\Large 菜$
赛后总结
T1
大水题,过
T2
赛时,想到了循环节,然后直接枚举区间内与循环的不同。正解是先预处理循环节储存前缀和,然后取6种情况中最小值。
#include<bits/stdc++.h>
using namespace std;
#define M 200010
#define int long long
#define INF 0x3f3f3f3f
#define LINF 0x3f3f3f3f3f3f3f3f
#define fr(i,j,k) for(int i=j;i<=k;++i)
#define rs(i,j,k) for(int i=j;i>=k;--i)
#define endl '\n'
#define IOS ios::sync_with_stdio(0)
#define pb(i) push_back(i)
#define pf(i) push_front(i)
#define mem(a,b) memset(a,b,sizeof a)
int n, m;
char s[M];
string a[6];
int sum[6][M];
signed main() {
scanf("%lld%lld",&n,&m);
scanf("%s",s);
a[0] = "abc";
a[1] = "acb";
a[2] = "bac";
a[3] = "bca";
a[4] = "cab";
a[5] = "cba";
fr(i,1,n)
fr(j,0,5)
sum[j][i] = (s[i - 1] != a[j][(i + 1) % 3]) + sum[j][i - 1];
while (m--) {
int l, r, ans = n;
scanf("%lld%lld",&l,&r);
fr(i,0,5){
int S = sum[i][r] - sum[i][l - 1];
ans = min(ans, S);
}
printf("%lld\n",ans);
}
return 0;
}
//时间轴
T3
小水题,还行。
$dp_i = dp _ {i-1} + dp_{i-m+1}$