zoukankan      html  css  js  c++  java
  • POJ-2528 (线段树 + 离散化)

    一道线段树 + 离散化的题,因为搞错了建树的L和R卡了一会儿。

    其实不用建树的,只是我比较习惯写带结构体的线段树。。。

    线段树还是没完全搞懂,先把这题放在这里作为记录。

    ac代码

    #include <iostream>
    #include <algorithm>
    #include <vector>
    
    using namespace std;
    typedef long long ll;
    const int maxn = 2e5 + 5;
    
    struct node
    {
        int l, r, val;
    }tree[maxn << 2];
    
    node arr[maxn << 2];
    int Hash[maxn << 2];
    int vis[maxn << 2];
    
    void build(int l, int r, int k)
    {
        tree[k].l = l; tree[k].r = r;
        if (l == r) return;
        int mid = (l + r) >> 1;
        build(l, mid, k << 1);
        build(mid + 1, r, k << 1 | 1);
        return;
    }
    
    void pushdown(int k)
    {
        tree[k << 1].val = tree[k << 1 | 1].val = tree[k].val;
        tree[k].val = 0;
    }
    
    void updata(int l, int r, int k, int c)
    {
        if (l <= tree[k].l && r >= tree[k].r)
        {
            tree[k].val = c;
            return;
        }
        if (tree[k].val != 0) pushdown(k);
        int mid = (tree[k].l + tree[k].r) >> 1;
        if (l > mid) updata(l, r, k << 1 | 1, c);
        else if (r <= mid) updata(l, r, k << 1, c);
        else
        {
            updata(l, r, k << 1, c);
            updata(l, r, k << 1 | 1, c);
        }
        return;
    }
    
    int ans = 0;
    void query(int k)
    {
        if (tree[k].val != 0)
        {
            if (!vis[tree[k].val])
            {
                ans++;
                vis[tree[k].val] = 1;
            }
            return;
        }
        if (tree[k].l == tree[k].r) return;
        query(k << 1);
        query(k << 1 | 1);
    }
    
    int main()
    {
        int q;
        scanf("%d", &q);
        while (q--)
        {
            memset(tree, 0, sizeof(tree));
            memset(arr, 0, sizeof(arr));
            memset(vis, 0, sizeof(vis));
            int n;
            scanf("%d", &n);
            int len = 0;
            for (int i = 0; i < n; i++)
            {
                scanf("%d %d", &arr[i].l, &arr[i].r);
                Hash[len++] = arr[i].l;
                Hash[len++] = arr[i].r;
            }
            sort(Hash, Hash + len);
            int m = unique(Hash, Hash + len) - Hash;
            int t = m;
            for (int i = 1; i < t; i++)
            {
                if (Hash[i] - Hash[i - 1] > 1) Hash[m++] = Hash[i - 1] + 1;
            }
            sort(Hash, Hash + m);
            build(0, m - 1, 1);
            for (int i = 0; i < n; i++)
            {
                int x = lower_bound(Hash, Hash + m, arr[i].l) - Hash;
                int y = lower_bound(Hash, Hash + m, arr[i].r) - Hash;
                updata(x, y, 1, i + 1);
            }
            ans = 0;
            query(1);
            printf("%d
    ", ans);
        }
        return 0;
    }
  • 相关阅读:
    [NHibernate]条件查询Criteria Query
    [JQuery]用InsertAfter实现图片走马灯展示效果
    [NHibernate]HQL查询
    [NHibernate]基本配置与测试
    [HTML/CSS]margin属性用法
    [HTML/CSS]盒子模型,块级元素和行内元素
    [Asp.net MVC]Asp.net MVC5系列——布局视图
    [c#基础]值类型和引用类型的Equals,==的区别
    用中间件实现读负载均衡的数据库群集
    论数据库连接池对中间件性能的重要性
  • 原文地址:https://www.cnblogs.com/zny0222/p/13846746.html
Copyright © 2011-2022 走看看