玄关
  • 板块学术版
  • 楼主dvsfanjo
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/5/25 11:27
  • 上次更新2024/5/25 14:16:58
查看原帖
玄关
1198462
dvsfanjo楼主2024/5/25 11:27

link

AC14个RE30个,求调

#include <bits/stdc++.h>
using namespace std;
const int N = 2e6 + 5;
int tree[4 * N], a[N], n, m, t, x, y, tot, s[N];
void build(int l, int r, int id)
{
	if (l == r)
	{
		tree[id] = a[l];
		return;
	}
	int mid = (l + r) >> 1;
	build(l, mid, id * 2);
	build(mid + 1, r, id * 2 + 1);
	tree[id] = min(tree[id * 2], tree[id * 2 + 1]);
	return;
}
void change(int l, int r, int id)
{
	if (l == r)
	{
		tree[id] = y;
		return;
	}
	int mid = (l + r) >> 1;
	if (l <= x and x <= mid)
		change(l, mid, id * 2);
	if (mid < x and x <= r) 
		change(mid + 1, r, id * 2 + 1);
	tree[id] = min(tree[id * 2], tree[id * 2 + 1]);
	return;
}
int mn(int l, int r, int id)
{
	if (l > y or r < x) 
		return INT_MAX;
	if (l == x and r == y)
		return tree[id];
	int mid = (l + r) >> 1;
	return min(mn(l, mid, id * 2), mn(mid + 1, r, id * 2 + 1));
}
void fnd(int l, int r, int id, int v)
{
	if (l == r) 
	{
		if (tree[id] == v and x <= l and l <= y) 
			s[++tot] = l;
		return;
	}
	int mid = (l + r) >> 1;
	if (x <= l && r <= y) 
	{
		if(tree[id * 2] == v) 
			fnd(l, mid, id * 2, v);
		if(tree[id * 2 + 1] == v) 
			fnd(mid + 1, r, id * 2 + 1, v); 
		return;
	}
	if (l <= x and x <= mid) 
		fnd(l, mid, id * 2, v);
	if (mid < y and y <= r) 
		fnd(mid + 1, r, id * 2 + 1, v);
	return;
}
int main()
{
	ios::sync_with_stdio(0);
	cin.tie();
	cin >> n >> m;
	for (int i = 1; i <= n; i++) 
		cin >> a[i];
	build(1, n, 1);
	for (int i = 1; i <= m; i++)
	{
		cin >> t >> x >> y;
		if (t == 1)
			change(1, n, 1);
		else
		{
			int v = mn(1, n, 1);
			fnd(1, n, 1, v);
			cout << tot << " ";
			for (int i = 1; i <= tot; i++)
				cout << s[i] << " ";
			cout << endl;
			tot = 0;
		}
	}
	return 0;
}
2024/5/25 11:27
加载中...