求大致看一下ABC415F代码思路有无问题
查看原帖
求大致看一下ABC415F代码思路有无问题
928568
zhouzihan20110620楼主2025/7/19 21:48

rt:

#include <iostream>
#include <string>
using namespace std;
struct Tree
{
	long long len, lans, rans, midans;
	char lc, rc;
}
tree[2000005];
long long n, q, opt, x, y;
char s[500005];
void pushup(int k)
{
	tree[k].lc = tree[k << 1].lc;
	tree[k].rc = tree[k << 1 | 1].rc;
	tree[k].lans = max(tree[k << 1].lans, tree[k << 1].lans == tree[k << 1].len ? tree[k << 1].len + tree[k << 1 | 1].lans : 0ll);
	tree[k].rans = max(tree[k << 1 | 1].rans, tree[k << 1 | 1].rans == tree[k << 1 | 1].len ? tree[k << 1 | 1].len + tree[k << 1].rans : 0ll);
	tree[k].midans = max((tree[k << 1].rc == tree[k << 1 | 1].lc ? tree[k << 1].rans + tree[k << 1 | 1].lans), max(max(tree[k].lans, tree[k].rans), max(tree[k << 1].midans, tree[k << 1 | 1].midans)));
}
void pushuplrk(Tree l, Tree r, Tree &k)
{
	k.lc = l.lc;
	tree[k].rc = tree[r].rc;
	tree[k].lans = max(tree[l].lans, tree[l].lans == tree[l].len ? tree[l].len + tree[r].lans : 0ll);
	tree[k].rans = max(tree[r].rans, tree[r].rans == tree[r].len ? tree[r].len + tree[l].rans : 0ll);
	tree[k].midans = max((tree[l].rc == tree[r].lc ? tree[l].rans + tree[r].lans), max(max(tree[k].lans, tree[k].rans), max(tree[l].midans, tree[r].midans)));
}
void mkt(int l, int r, int k)
{
	tree[k].len = r - l + 1;
	if (l == r)
	{
		tree[k].lc = tree[k].rc = s[l];
		tree[k].lans = tree[k].rans = tree[k].midans = 1;
		return;
	}
	int mid = (l + r) >> 1;
	mkt(l, mid, k << 1);
	mkt(mid + 1, r, k << 1 | 1);
	pushup(k);
}
void update(int L, int R, char c, int l, int r, int k)
{
	if (L <= l && r <= R)
	{
		tree[k].lc = tree[k].rc = c;
		tree[k].lans = tree[k].rans = tree[k].midans = 1;
		return;
	}
	int mid = (l + r) >> 1;
	if (L <= mid)
	{
		update(L, R, c, l, mid, k << 1);
	}
	if (mid < R)
	{
		update(L, R, c, mid + 1, r, k << 1 | 1);
	}
	pushup(k);
}
Tree query(int L, int R, int l, int r, int k)
{
	if (L <= l && r <= R)
	{
		return tree[k];
	}
	int mid = (l + r) >> 1;
	Tree lans, rans, ans;
	if (L <= mid && mid < R)
	{
		lans = query(L, R, l, mid, k << 1);
		rans = query(L, R, mid + 1, r, k << 1 | 1);
		pushuplrk(lans, rans, ans);
		return ans;
	}
	if (L <= mid)
	{
		return query(L, R, l, mid, k << 1);
	}
	if (mid < R)
	{
		return query(L, R, mid + 1, r, k << 1 | 1);
	}
}
int main()
{
	cin >> n >> q >> s + 1;
	while (q--)
	{
		cin >> opt >> x >> y;
		if (opt == 1)
		{
			update(x, x, y, 1, n, 1);
		}
		else
		{
			cout << query(x, y, 1, n, 1) << "\n";
		}
	}
	return 0;
}

只需看思路即可,代码我自己调(当然要是有人帮忙那更好了OWO)

2025/7/19 21:48
加载中...