初赛萌新中序遍历求调
查看原帖
初赛萌新中序遍历求调
804607
rainygame楼主2024/8/10 15:49
#include <bits/stdc++.h>
using namespace std;
#define MAXN 100001

int n, m, ans, cnt;
int a[MAXN], g[MAXN], f[MAXN], b[MAXN];
int ls[MAXN], rs[MAXN];

void dfs(int x){
	if (ls[x]) dfs(ls[x]);
	b[++cnt] = a[x];
	if (rs[x]) dfs(rs[x]);
}

namespace BIT{
#define lbw(x) (x & -x)
	int c[MAXN];
	void add(int x, int v){for (; x<=n; x+=lbw(x)) c[x] = max(c[x], v);}
	int query(int x){int res(0); for (; x; x-=lbw(x)) res = max(res, c[x]); return res;}
}

signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);

	cin >> n; for (int i(1); i<=n; ++i) cin >> a[i], g[i] = a[i];
	sort(g+1, g+n+1); m = unique(g+1, g+n+1)-g;
	for (int i(1); i<=n; ++i) a[i] = lower_bound(g+1, g+m+1, a[i])-g;
	for (int i(2), u, v; i<=n; ++i){cin >> u >> v; if (v) rs[u] = i; else ls[u] = i;}
	dfs(1); assert(cnt == n);

	for (int i(1); i<=cnt; ++i){
		BIT::add(b[i], f[i]=BIT::query(b[i]-1)+1);
		ans = max(ans, f[i]);
	}
	cout << n-ans;

	return 0;
}

交上去会全部 RE,应该是 assert 那里,为什么 cnt 和 n 会不相等?

2024/8/10 15:49
加载中...