社区讨论

线段树 20 pts 求调

P6564 [POI 2007] 堆积木KLO参与者 3已保存回复 6

讨论操作

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

当前回复
6 条
当前快照
1 份
快照标识符
@mhj2vbxa
此快照首次捕获于
2025/11/03 19:49
4 个月前
此快照最后确认于
2025/11/03 19:49
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn = 1e6 + 5;
int n, ans, y, tree[4 * maxn];
struct Node{
	int id, v;
	void input()
	{
		cin >> v;
	}
	bool operator <(const Node &o) const{
		if (o.id - o.v == id - v)
		{
			return id < o.id;
		}
		return id - v < o.id - o.v;
	}
}a[maxn];
int ls(int x)
{
	return 2 * x;
}
int rs(int x)
{
	return 2 * x + 1;
}
void up(int x)
{
	tree[x] = max(tree[ls(x)], tree[rs(x)]);
}
void update(int x, int l, int r, int p, int k)
{
	if (l == r)
	{
		tree[x] = max(tree[x], k);
		return;
	}
	int mid = (l + r) / 2;
	if (p <= mid)
	{
		update(ls(x), l, mid, p, k);
	}
	if (p >= mid + 1)
	{
		update(rs(x), mid + 1, r, p, k);
	}
	up(x);
	return;
}
int query(int x, int l, int r, int p)
{
	if (l == r)
	{
		return tree[x];
	}
	int mid = (l + r) / 2, ret;
	if (p <= mid)
	{
		ret = query(ls(x), l, mid, p);
	}
	if (p >= mid + 1)
	{
		ret = query(rs(x), mid + 1, r, p);
	}
	return ret;
} 
signed main()
{
	cin >> n;
	for (int i = 1; i <= n; ++ i)
	{
		a[i].input();
		a[i].id = i;
		y = max(y, a[i].v);
	}
	sort(a + 1, a + 1 + n);
	for (int i = 1; i <= n; ++ i)
	{
		if (a[i].v > a[i].id)
		{
			continue;
		}
		int h = query(1, 1, y, a[i].v - 1) + 1;
		update(1, 1, y, a[i].v, h);
		ans = max(ans, h);
	}
	cout << ans;
	return 0;
}

回复

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

正在加载回复...