Educational Codeforces Round 6

来源:互联网 发布:实体经济下滑数据 编辑:程序博客网 时间:2024/05/18 00:09

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



0 0
原创粉丝点击