2024.4.1-4.7 训练记录(25)

  • 之后还是按周来记录训练情况
  • 最近忙着挑战杯,说真的有点后悔参加但又不好临阵脱逃,不过好在省赛文本提交了,接下来的时间可以全部投入在算法上了
  • 这周复习了一下寒假接触过的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();
	}
}
  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Texcavator

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值