#include<bits/stdc++.h> usingnamespace std; #define ll long long constint INF = 0x3f3f3f3f; const ll inf = 0x3f3f3f3f3f3f3f3f; constint N = 2e5 + 10; const ll mod = 998244353; int n; int a[N]; int b[N]; int ans; intmain(){ scanf("%d", &n); for (int i = 0; i < n; i++)scanf("%d", &a[i]); for (int i = 0; i < n; i++) { fill(b, b + n + 1, INF); for (int j = 0; j < n; j++) { int p = lower_bound(b, b + n, a[(i + j) % n]) - b; b[p] = a[(i + j) % n]; } for (int j = n - 1; j >= 0; j--) { if (b[j] < INF) { ans = max(ans, j + 1); break; } } } printf("%d\n", n - ans); return0; }
#include<bits/stdc++.h> usingnamespace std; #define ll long long constint INF = 0x3f3f3f3f; const ll inf = 0x3f3f3f3f3f3f3f3f; constint N = 2e5 + 10; const ll mod = 998244353; int n; int a[N]; structE { int v, w; }; vector<E>G[N]; voiddfs(int u, int _fa, int le){ a[u] = le; for (E& e : G[u]) { if (e.v == _fa)continue; dfs(e.v, u, e.w^le); } } structTrie { int ch[N * 40][2]; int tot = 0;
voidins(int& now, int x, int dep){ if (!now)now = ++tot; if (dep < 0)return; int bit = ((a[x] >> dep) & 1); ins(ch[now][bit], x, dep - 1); }
ll qry(int now, int val, int dep){ //val与存在Trie中的数的最小差值 if (dep < 0)return0; int bit = ((val >> dep) & 1); if (ch[now][bit])returnqry(ch[now][bit], val, dep - 1); elsereturnqry(ch[now][bit ^ 1], val, dep - 1) + (1ll << dep); } }Tri; vector<int>vc; ll solve(vector<int>&vc, int rt, int dep){ if (!rt)return0; vector<int>vv[2]; for (int u : vc)vv[(u >> dep) & 1].push_back(u); if (vv[0].empty())returnsolve(vv[1], Tri.ch[rt][1], dep - 1); if (vv[1].empty())returnsolve(vv[0], Tri.ch[rt][0], dep - 1); ll tmp = inf; for (int u : vv[1]) { tmp = min(tmp, Tri.qry(Tri.ch[rt][0], u, dep - 1) + (1ll << dep)); } return tmp + solve(vv[0], Tri.ch[rt][0], dep - 1) + solve(vv[1], Tri.ch[rt][1], dep - 1); } intmain(){ scanf("%d", &n); for (int i = 1; i < n; i++) { int u, v, w; scanf("%d%d%d", &u, &v, &w); u++; v++; G[u].push_back(E{ v,w }); G[v].push_back(E{ u,w }); } dfs(1, 0, 0); int root = 0; for (int i = 1; i <= n; i++)vc.push_back(a[i]), Tri.ins(root, i, 30); printf("%lld\n", solve(vc, 1, 30)); return0; }