Educational Codeforces Round 6

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

dfs一下存下dfs序,然后就是区间修改区间查询,用一个二进制数维护颜色。

#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;
}



你可能感兴趣的:(Educational Codeforces Round 6)