当前位置:网站首页>[daily question] 729 My schedule I
[daily question] 729 My schedule I
2022-07-06 06:51:00 【Wang Liuliu's it daily】
729. My schedule I
Reference resources : The blog post written by the boss in the effort to explain the topic ----- Line tree details 「 Summary level collation 」
Line tree series :
The segment tree solves 「 Interval and 」 The problem of , And the 「 Section 」 Will be modified .
Take a simple one , about nums = [1, 2, 3, 4, 5].
If we need to sum a certain interval many times , Did you first think of using 「 The prefix and 」.
The detailed introduction of prefix and can be seen Prefixes and arrays
nums = [1, 2, 3, 4, 5] The corresponding segment tree is as follows :
Each node represents an interval , And the value of the node is the sum of the interval .
- Sum of numbers 「 The sum of the total figures = The sum of the numbers in the left range + The sum of the numbers in the right range 」
- The greatest common factor (GCD)「 total GCD = gcd( Left interval GCD, The right range GCD)」
- Maximum 「 Total maximum = max( The maximum value of the left range , Maximum value in the right range )」
Data structure of segment tree
We can use arrays to represent a segment tree , Suppose the root node is i, Then the node of the left child is 2 * i, The node of the right child is 2 * i + 1 ( Premise :i from 1 Start )
We can use a linked list to represent a segment tree , The data structure of its nodes is as follows :
class Node {
// Left and right child nodes
Node left, right;
// Current node value
int val;
}
Prefer to use linked lists , Because it saves memory , The following implementations are based on linked lists .
Establishment of line segment tree
If a specific range is given in the title , We build a segment tree according to this range .
public void buildTree(Node node, int start, int end) {
// To the leaf node
if (start == end) {
node.val = arr[start];
return ;
}
int mid = (start + end) >> 1;
buildTree(node.left, start, mid);
buildTree(node.right, mid + 1, end);
// Update up
pushUp(node);
}
// Update up
private void pushUp(Node node) {
node.val = node.left.val + node.right.val;
}
But a lot of times , No specific scope is given in the title , Only the value range of data , It's usually big , So we often use 「 Dynamic opening point 」.
「 Dynamic opening point 」 Usually in 「 to update 」 or 「 Inquire about 」 Dynamically establish nodes when , See the following update and query operations for details .
Complete template of segment tree
Be careful : The following template is based on 「 Interval and 」 And the interval 「 Addition and subtraction 」 Update operation for , And for 「 Dynamic opening point 」
/** * @Description: Line segment tree ( Dynamic opening point ) * @Author: LFool * @Date 2022/6/7 09:15 **/
public class SegmentTreeDynamic {
class Node {
Node left, right;
int val, add;
}
private int N = (int) 1e9;
private Node root = new Node();
public void update(Node node, int start, int end, int l, int r, int val) {
if (l <= start && end <= r) {
node.val += (end - start + 1) * val;
node.add += val;
return ;
}
int mid = (start + end) >> 1;
pushDown(node, mid - start + 1, end - mid);
if (l <= mid) update(node.left, start, mid, l, r, val);
if (r > mid) update(node.right, mid + 1, end, l, r, val);
pushUp(node);
}
public int query(Node node, int start, int end, int l, int r) {
if (l <= start && end <= r) return node.val;
int mid = (start + end) >> 1, ans = 0;
pushDown(node, mid - start + 1, end - mid);
if (l <= mid) ans += query(node.left, start, mid, l, r);
if (r > mid) ans += query(node.right, mid + 1, end, l, r);
return ans;
}
private void pushUp(Node node) {
node.val = node.left.val + node.right.val;
}
private void pushDown(Node node, int leftNum, int rightNum) {
if (node.left == null) node.left = new Node();
if (node.right == null) node.right = new Node();
if (node.add == 0) return ;
node.left.val += node.add * leftNum;
node.right.val += node.add * rightNum;
// The interval is 「 Addition and subtraction 」 Update operation for , You need to add up when pushing down the lazy flag , Cannot directly cover
node.left.add += node.add;
node.right.add += node.add;
node.add = 0;
}
}
class MyCalendar {
public MyCalendar() {
}
public boolean book(int start, int end) {
// First query whether the interval is 0
if (query(root, 0, N, start, end - 1) != 0) return false;
// Update the interval
update(root, 0, N, start, end - 1, 1);
return true;
}
// *************** Here is the template ***************
class Node {
// Left and right child nodes
Node left, right;
// Current node value , And the value of the lazy tag
int val, add;
}
private int N = (int) 1e9;
private Node root = new Node();
public void update(Node node, int start, int end, int l, int r, int val) {
if (l <= start && end <= r) {
node.val += val;
node.add += val;
return ;
}
pushDown(node);
int mid = (start + end) >> 1;
if (l <= mid) update(node.left, start, mid, l, r, val);
if (r > mid) update(node.right, mid + 1, end, l, r, val);
pushUp(node);
}
public int query(Node node, int start, int end, int l, int r) {
if (l <= start && end <= r) return node.val;
pushDown(node);
int mid = (start + end) >> 1, ans = 0;
if (l <= mid) ans = query(node.left, start, mid, l, r);
if (r > mid) ans = Math.max(ans, query(node.right, mid + 1, end, l, r));
return ans;
}
private void pushUp(Node node) {
// Each node stores the maximum value of the current interval
node.val = Math.max(node.left.val, node.right.val);
}
private void pushDown(Node node) {
if (node.left == null) node.left = new Node();
if (node.right == null) node.right = new Node();
if (node.add == 0) return ;
node.left.val += node.add;
node.right.val += node.add;
node.left.add += node.add;
node.right.add += node.add;
node.add = 0;
}
}
/** * Your MyCalendar object will be instantiated and called as such: * MyCalendar obj = new MyCalendar(); * boolean param_1 = obj.book(start,end); */
边栏推荐
- [ 英语 ] 语法重塑 之 动词分类 —— 英语兔学习笔记(2)
- Latex文字加颜色的三种办法
- 【刷题】怎么样才能正确的迎接面试?
- What are the commonly used English words and sentences about COVID-19?
- AttributeError: Can‘t get attribute ‘SPPF‘ on <module ‘models. common‘ from ‘/home/yolov5/models/comm
- Apache DolphinScheduler源码分析(超详细)
- MySQL high frequency interview 20 questions, necessary (important)
- Map of mL: Based on the adult census income two classification prediction data set (whether the predicted annual income exceeds 50K), use the map value to realize the interpretable case of xgboost mod
- After sharing the clone remote project, NPM install reports an error - CB () never called! This is an error with npm itself.
- My seven years with NLP
猜你喜欢
L'Ia dans les nuages rend la recherche géoscientifique plus facile
Attributeerror: can 't get attribute' sppf 'on < module' models. Common 'from' / home / yolov5 / Models / comm
Office doc add in - Online CS
红蓝对抗之流量加密(Openssl加密传输、MSF流量加密、CS修改profile进行流量加密)
SAP SD发货流程中托盘的管理
ROS学习_基础
Windows Server 2016 standard installing Oracle
[ 英語 ] 語法重塑 之 動詞分類 —— 英語兔學習筆記(2)
Apache dolphin scheduler source code analysis (super detailed)
AttributeError: Can‘t get attribute ‘SPPF‘ on <module ‘models. common‘ from ‘/home/yolov5/models/comm
随机推荐
How to do a good job in financial literature translation?
AttributeError: Can‘t get attribute ‘SPPF‘ on <module ‘models.common‘ from ‘/home/yolov5/models/comm
Fedora/rehl installation semanage
指尖上的 NFT|在 G2 上评价 Ambire,有机会获得限量版收藏品
Monotonic stack
How to translate professional papers and write English abstracts better
因高额网络费用,Arbitrum 奥德赛活动暂停,Nitro 发行迫在眉睫
librosa音频处理教程
mysql的基础命令
[brush questions] how can we correctly meet the interview?
[English] Verb Classification of grammatical reconstruction -- English rabbit learning notes (2)
成功解决AttributeError: Can only use .cat accessor with a ‘category‘ dtype
雲上有AI,讓地球科學研究更省力
电子书-CHM-上线CS
中青看点阅读新闻
医疗软件检测机构怎么找,一航软件测评是专家
Do you really know the use of idea?
LeetCode - 152 乘积最大子数组
[Yu Yue education] Dunhuang Literature and art reference materials of Zhejiang Normal University
The ECU of 21 Audi q5l 45tfsi brushes is upgraded to master special adjustment, and the horsepower is safely and stably increased to 305 horsepower