社区讨论

样例测试点都能过但就是0分,解答必关

P1531I Hate It参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@m3ball0g
此快照首次捕获于
2024/11/10 15:48
去年
此快照最后确认于
2024/11/10 16:21
去年
查看原帖
CPP
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int input[200001];
struct Tree
{
	int l, r;
	int maxn;
}tree[800001];
//创建线段树
void CreateTree(int l, int r, int i)
{
	tree[i].l = l; tree[i].r = r;
	if (l == r)
	{
		tree[i].maxn = input[l];
		return;
	}
	int mid = (l + r) / 2;
	CreateTree(l, mid, 2 * i);
	CreateTree(mid + 1, r, 2 * i + 1);
	tree[i].maxn = max(tree[2 * i].maxn, tree[2 * i + 1].maxn);
}
//
int Search(int l, int r, int i)
{
	if (tree[i].l >= l && tree[i].r <= r)
	{
		return tree[i].maxn;
	}
	if (tree[i].r <l || tree[i].l >r)
	{
		return 0;
	}
	int maxl, maxr;
	if (tree[2 * i].r >= l)
	{
		maxl = Search(l, r, 2 * i);
	}
	if (tree[2 * i + 1].l <= r)
	{
		maxr = Search(l, r, 2 * i + 1);
	}
	return max(maxl, maxr);
}
//修改数据
void Change(int pos, int k, int i)
{
	if (tree[i].l == tree[i].r)
	{
		if(tree[i].maxn < k)
		{
			tree[i].maxn = k;
		}
		return;
	}
	if (tree[2 * i].r >= pos)
	{
		Change(pos, k, 2 * i);
	}
	else
	{
		Change(pos, k, 2 * i + 1);
	}
	tree[i].maxn = max(tree[2 * i].maxn, tree[2 * i + 1].maxn);
}



int main()
{
	int n, m;
	scanf("%d%d", &n, &m);
	for (int i = 1; i <= n; i++)
	{
		scanf("%d", &input[i]);
	}
	CreateTree(1, n, 1);
	char c[2];
	int a, b;
	for (int i = 0; i < m; i++)
	{
		scanf("%s%d%d", c, &a, &b);
		if (c[0] == 'Q')
		{
			cout << Search(a, b, 1) << endl;
		}
		if (c[0] == 'U')
		{
			Change(a, b, 1);
		}
	}
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...