- 之后还是按周来记录训练情况
- 最近忙着挑战杯,说真的有点后悔参加但又不好临阵脱逃,不过好在省赛文本提交了,接下来的时间可以全部投入在算法上了
- 这周复习了一下寒假接触过的splay树,其实基本上可以看成是重新学了一遍,因为之前为了方便理解学的板子根本没法用,这回总结了很多人的代码搞了一套自己的板子,然后在洛谷找了个平衡树题单,刷了些题,算是了解它的基本用法了,总之还是不要畏难,也就是个带旋转的线段树嘛,重要的第一是要能看出来题目是考的这个,第二是要提升码力,自己要能敲
- 接下来的计划还是继续学数据结构,然后每天要写个几道cf,保证脑子能转动,数据结构这个玩意真是锻炼码力啊
CF 1672H Zigu Zagu
智慧题,因为010101这样的串我们可以直接消掉,所以没必要考虑这个,只要考虑11和00这样连在一起的串就可以,因为每两个相同的字母连在一起我们就要额外再消一次,所以前缀和计算一下有多少11和多少00,然后取大的(为什么取大的呢?因为举个例子:11[可以消掉的部分]00,我们可以先把中间消掉,然后变成:1100,把中间的10消掉,就可以减少需要的次数了)
#include <bits/stdc++.h>
using namespace std;
#define int long long
using i64 = long long;
typedef pair<int, int> PII;
typedef pair<int, char> PIC;
typedef pair<double, double> PDD;
typedef pair<int, PII> PIII;
typedef pair<int, pair<int, bool>> PIIB;
const int N = 1e5 + 10;
const int mod = 1e9 + 7;
const int maxn = 1e6 + 10;
const int mod1 = 954169327;
const int mod2 = 906097321;
const int INF = 0x3f3f3f3f3f3f3f3f;
void solve()
{
int n, q;
cin >> n >> q;
string s;
cin >> s;
s = " " + s;
vector<int> a(n + 1), b(n + 1);
for (int i = 2; i <= n; i ++ )
{
if (s[i] == s[i - 1])
{
if (s[i] == '1') a[i] = 1;
else b[i] = 1;
}
a[i] += a[i - 1];
b[i] += b[i - 1];
}
while (q -- )
{
int l, r;
cin >> l >> r;
cout << max(a[r] - a[l], b[r] - b[l]) + 1 << '\n';
}
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
int t = 1;
// cin >> t;
while (t--)
{
solve();
}
}