zoukankan      html  css  js  c++  java
  • 湘潭大学校赛H-统计颜色 线段树

    链接:https://www.nowcoder.com/acm/contest/105/H
    来源:牛客网

    n个桶按顺序排列,我们用1~n给桶标号。有两种操作:
    1 l r c 区间[l,r]中的每个桶中都放入一个颜色为c的球 (1≤l,r ≤n,l≤r,0≤c≤60)
    2 l r   查询区间[l,r]的桶中有多少种不同颜色的球     (1≤l,r ≤n,l≤r)

    ac代码:

    #define _CRT_SECURE_NO_WARNINGS
    #include<cstring>
    #include<cctype>
    #include<cstdlib>
    #include<cmath>
    #include<cstdio>
    #include<string>
    #include<stack>
    #include<ctime>
    #include<list>
    #include<set>
    #include<map>
    #include<queue>
    #include<vector>
    #include<sstream>
    #include<iostream>
    #include<functional>
    #include<algorithm>
    #include<memory.h>
    using namespace std;
    #define eps 1e-6
    #define pi acos(-1.0)
    #define e exp(1.0)
    #define rep(i,t,n)  for(int i =(t);i<=(n);++i)
    #define per(i,n,t)  for(int i =(n);i>=(t);--i)
    #define mp make_pair
    #define pb push_back
    #define mmm(a,b) memset(a,b,sizeof(a))
    typedef long long ll;
    const int maxn = 1e5 + 5;
    ll tree[maxn * 4], lazy[maxn * 4];
    void pushdown(ll root) {
        tree[root << 1] |= lazy[root];
        tree[root << 1 | 1] |= lazy[root];
        lazy[root << 1] |= lazy[root];
        lazy[root << 1 | 1] |= lazy[root];
        lazy[root] = 0;
    }
    void update(ll l, ll r, ll L, ll R, ll root, ll clr) {
        if (l <= L&&r >= R) {
            tree[root] |= clr;
            lazy[root] |= clr;
            return;
        }
        ll mid = L + R >> 1;
        if (lazy[root])pushdown(root);
        if (r <= mid)update(l, r, L, mid, root << 1, clr);
        else if (l > mid)update(l, r, mid+1, R, root << 1 | 1, clr);
        else {
            update(l, mid, L, mid, root << 1, clr);
            update(mid + 1, r, mid + 1, R, root << 1 | 1, clr);
        }
        tree[root] = tree[root << 1] | tree[root << 1 | 1];
    
     }
    ll query(ll l, ll r, ll L, ll R, ll root, ll clr) {
        if (l <= L&&r >= R) {
            
            return tree[root];
        }
        ll mid = L + R >> 1;
        if (lazy[root])pushdown(root);
        if (r <= mid)return query(l, r, L, mid, root << 1, clr);
        else if (l > mid)return query(l, r, mid+1    , R, root << 1 | 1, clr);
        else {
            return query(l, mid, L, mid, root << 1, clr)| query(mid + 1, r, mid + 1, R, root << 1 | 1, clr);;
            
        }
        tree[root] = tree[root << 1] | tree[root << 1 | 1];
    
    }
    int main()
    {
        ios::sync_with_stdio(false);
        int n, m;
        while (cin >> n >> m) {
            mmm(tree, 0);
            mmm(lazy, 0);
            rep(i, 1, m) {
                ll x, l, r, c;
                cin >> x;
                if (x == 1) {
                    cin >> l >> r >> c;
                    update(l, r, 1, n, 1, 1ll << c);
    
                }
                if (x == 2) {
                    cin >> l >> r;
                    ll ans = query(l, r, 1, n,1, 1);
                    int res = 0;
                    while (ans) {
                        if (ans & 1)res++;
                        ans >>= 1;
                    }
                    cout << res << endl;
                }
            }
        }
        
    
    
        
    }

    tle代码

    #define _CRT_SECURE_NO_WARNINGS
    #include<cstring>
    #include<cctype>
    #include<cstdlib>
    #include<cmath>
    #include<cstdio>
    #include<string>
    #include<stack>
    #include<ctime>
    #include<list>
    #include<set>
    #include<map>
    #include<queue>
    #include<vector>
    #include<sstream>
    #include<iostream>
    #include<functional>
    #include<algorithm>
    #include<memory.h>
    //#define INF 0x3f3f3f3f
    #define eps 1e-6
    #define pi acos(-1.0)
    #define e exp(1.0)
    #define rep(i,t,n)  for(int i =(t);i<=(n);++i)
    #define per(i,n,t)  for(int i =(n);i>=(t);--i)
    #define mp make_pair
    #define pb push_back
    #define mmm(a,b) memset(a,b,sizeof(a))
    //std::ios::sync_with_stdio(false);
    using namespace std;
    typedef long long ll;
    typedef unsigned long long ull;
    void smain();
    #define ONLINE_JUDGE
    int main() {
    //    ios::sync_with_stdio(false);
    #ifndef ONLINE_JUDGE
        freopen("in.txt", "r", stdin);
        freopen("out.txt", "w", stdout);
        long _begin_time = clock();
    #endif
        smain();
    #ifndef ONLINE_JUDGE
        long _end_time = clock();
        printf("time = %ld ms.", _end_time - _begin_time);
    #endif
        return 0;
    }
    #define  _CRT_SECURE_NO_WARNINGS
    
    const int maxn = 1e5 + 5;
    int a[maxn], n, q, l, r, val;
    typedef long long ll;
    struct node {
        int l, r;
        long long    sum, lazy;
        void update(long long x) {
            //sum += (ll)1 * (r - l + 1)*x;
            //lazy += x;
            sum |= x;
            lazy |= x;
        }
    }tree[maxn * 4];
    void push_up(int x) {
        //tree[x].sum = tree[x << 1].sum + tree[x << 1 | 1].sum;
        tree[x].sum = tree[x << 1].sum | tree[x << 1 | 1].sum;
    }
    void push_down(int x) {
        int lazyval = tree[x].lazy;
        if (lazyval) {
            tree[x << 1].update(lazyval);
            tree[x << 1 | 1].update(lazyval);
            tree->lazy = 0;
        }
    }
    void build(int x, int l, int r) {
        tree[x].l = l; tree[x].r = r;
        tree[x].sum = tree[x].lazy = 0;
        if (l == r) {
            tree[x].sum = 0;
        }
        else {
            int mid = l + r >> 1;
            build(x << 1, l, mid);
            build(x << 1 | 1, mid + 1, r);
            push_up(x);
        }
    }
    void update(int x, int l, int r, long long val) {
        int L = tree[x].l, R = tree[x].r;
        if (l <= L&&r >= R) {
            tree[x].update(val);
        }
        else {
            push_down(x);
            int mid = L + R >> 1;
            if (mid >= l)update(x << 1, l, r, val);
            if (r > mid)update(x << 1 | 1, l, r, val);
            push_up(x);
        }
    }
    long long query(int x, int l, int r) {
        int L = tree[x].l, R = tree[x].r;
        if (l <= L&&r >= R) {
            return tree[x].sum;
        }
        else {
            push_down(x);
            long long ans = 0;
            int mid = L + R >> 1;
            if (mid >= l)ans |= query(x << 1, l, r);
            if (r > mid)ans |= query(x << 1 | 1, l, r);
            push_up(x);
            return ans;
        }
    }
    
    void Run() {
    
    }
    
    void smain() {
        cin >> n >> q; {
            build(1, 1, n);
            rep(i, 1, q) {
                int x;
                scanf("%d", &x);
                //cin >> x;
                if (x == 1) {
                    int l, r, c;
                    scanf("%d%d%d", &l, &r,&c);
                    //cin >> l >> r >> c;
                    update(1, l, r, 1 << c);
    
                }
                else {
                    int l, r;
                    
                    scanf("%d%d", &l, &r);
                    //cin >> l >> r;
                    ll res= query(1, l, r);
                    int cnt=0;
    
                    while (res) {
                        if (res & 1)cnt++;
                        res >>= 1;
                    }
                    printf("%d
    ", cnt);
                    //cout << cnt << endl;
                }
            }
        }
    }
    成功的路并不拥挤,因为大部分人都在颓(笑)
  • 相关阅读:
    写了一个抓飞信包的小工具
    Drools.Net Bug?
    论坛系统分析比较
    在线个人财务管理服务推荐:财客在线网络账本
    多站点的google analytics的使用心得
    FeedSky更新出现很大延时
    愚人节,中华民族的伟大梦想实现了
    Community Server 2008.5 SP2发布啦
    [已上传流程图]在线服务器状态监控预警软件推荐:网站保姆
    五一公司搬家记
  • 原文地址:https://www.cnblogs.com/SuuT/p/8980086.html
Copyright © 2011-2022 走看看