标签: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. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。