C. Pearls in a Row
从左往右贪心。
#include <cstdio> #include <set> #include <vector> using namespace std; const int maxn = 3e5 + 100; set <int> bag; int n, a[maxn]; int main() { scanf("%d", &n); for (int i = 1; i <= n; i++) scanf("%d", &a[i]); int flag = 0; int ans = 0; int l = 1; vector < pair<int, int> > s; for (int i = 1; i <= n; i++) { if (bag.find(a[i]) != bag.end()) { bag.clear(); flag = 1; ans++; s.push_back({l, i}); l = i + 1; } else { bag.insert(a[i]); } } if (flag) { printf("%d\n", ans); if (bag.size()) s[s.size() - 1].second = n; for (int i = 0; i < s.size(); i++) printf("%d %d\n", s[i].first, s[i].second); } else printf("-1\n"); return 0; }
E. New Year Tree
#include <cstdio> #include <vector> using namespace std; typedef long long ll; const int maxn = 400100; vector <int> s[maxn]; ll node[maxn * 4], mark[maxn * 4]; int left[maxn], right[maxn], id[maxn], color[maxn], n, m, cnt; int bit_num(ll x) { int sum = 0; while (x) { sum += (x & 1); x >>= 1; } return sum; } void build(int l, int r, int o) { if (l == r) { node[o] = (1LL << color[id[l]]); //printf("%d\n",color[id[l]]); return ; } int mid = (l + r) / 2; build(l, mid, o * 2); build(mid + 1, r, o * 2 + 1); node[o] = node[o * 2] | node[o * 2 + 1]; } void dfs(int u, int fa) { left[u] = ++cnt; id[cnt] = u; for (int i = 0; i < s[u].size(); i++) { int v = s[u][i]; if (v != fa) dfs(v, u); } right[u] = cnt; } void pushdown(int o) { if (mark[o]) mark[o * 2] = mark[o * 2 + 1] = node[o * 2] = node[o * 2 + 1] = mark[o]; mark[o] = 0; } void add(int L, int R, int l, int r, int o, int v) { if (L <= l && r <= R) { node[o] = mark[o] = (1LL<<v); return; } pushdown(o); int mid = (l + r) / 2; if (L <= mid) add(L, R, l, mid, o * 2, v); if (R > mid) add(L, R, mid + 1, r, o * 2 + 1, v); node[o] = node[o * 2] | node[o * 2 + 1]; } ll query(int L, int R, int l, int r, int o) { if (L <= l && r <= R) return node[o]; ll ans = 0; pushdown(o); int mid = (l + r) / 2; if (L <= mid) ans |= query(L, R, l, mid, o * 2); if (R > mid) ans |= query(L, R, mid + 1, r, o * 2 + 1); return ans; } int main() { scanf("%d%d", &n, &m); cnt = 0; for (int i = 1; i <= n; i++) scanf("%d", &color[i]); for (int i = 0; i < n - 1; i++) { int x, y; scanf("%d%d", &x, &y); s[x].push_back(y); s[y].push_back(x); } dfs(1, -1); build (1, n ,1); for (int i = 0; i < m; i++) { int tk, u, v; scanf("%d", &tk); if (tk == 1) { scanf("%d%d", &u, &v); add(left[u], right[u], 1, n, 1, v); } else { scanf("%d", &u); ll ans = query(left[u], right[u], 1, n, 1); printf("%d\n", bit_num(ans)); } } return 0; }