ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

leetcode https://leetcode.cn/problems/count-integers-in-intervals/ 线段树解决

2022-05-15 17:00:36  阅读:204  来源: 互联网

标签:count integers cnt cl int mid tag cr leetcode


leetccode count-integers-in-intervals 线段树解决:


class CountIntervals {
    Seg root;

    public CountIntervals() {
        root = new Seg(1, 1000000000);
    }

    public void add(int left, int right) {
        root.add(left, right);
    }

    public int count() {
        return root.cnt;
    }

    public static void main(String[] args) {
        CountIntervals countIntervals = new CountIntervals();
        System.out.println(countIntervals.count());
        countIntervals.add(39, 44);

        System.out.println(countIntervals.count());
        countIntervals.add(13, 49);
        System.out.println(countIntervals.count());
        System.out.println(countIntervals.count());
        countIntervals.add(47, 50);
    }

    class Seg {
        int cl, cr;
        int cnt;
        boolean tag;
        Seg l, r;

        public Seg(final int cl, final int cr) {
            this.cl = cl;
            this.cr = cr;
            // this.cnt = cr - cl + 1;
            this.cnt = 0;
            this.tag = false;
        }

        public void pushdown() {
            if (this.tag) {
                int mid = (cl + cr) >> 1;
                if (this.l == null) {
                    this.l = new Seg(cl, mid);
                }
                if (this.r == null) {
                    this.r = new Seg(mid + 1, cr);
                }
                this.l.tag = true;
                this.r.tag = true;
                this.l.cnt = mid - cl + 1;
                this.r.cnt = cr - mid;
            }
        }

        public void pushup() {
            /// this.cnt = 0;

            this.tag = this.l.tag & this.r.tag;
            this.cnt = this.l.cnt + this.r.cnt;

        }

        public void add(int L, int R) {
            if (cl == L && cr == R) {
                this.tag = true;
                this.cnt = R - L + 1;
                return;
            }

            if (this.tag) {
                return;
            }

            //      pushdown();
            int mid = (cl + cr) >> 1;
            if (this.r == null) {
                this.r = new Seg(mid + 1, cr);
            }
            if (this.l == null) {
                this.l = new Seg(cl, mid);
            }
            if (R <= mid) {
                this.l.add(L, R);
            } else {
                if (L > mid) {//再右边加入
                    this.r.add(L, R);
                } else {
                    this.l.add(L, mid);
                    this.r.add(mid + 1, R);
                }
            }
            pushup();
        }
    }
}

/**
 * Your CountIntervals object will be instantiated and called as such:
 * CountIntervals obj = new CountIntervals();
 * obj.add(left,right);
 * int param_2 = obj.count();
 */

 

 

标签:count,integers,cnt,cl,int,mid,tag,cr,leetcode
来源: https://www.cnblogs.com/fishcanfly/p/16273636.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有