当前位置:网站首页>[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); */
边栏推荐
- BUU的MISC(不定时更新)
- My creation anniversary
- When my colleague went to the bathroom, I helped my product sister easily complete the BI data product and got a milk tea reward
- 从autojs到冰狐智能辅助的心里历程
- 【Hot100】739. 每日溫度
- Bitcoinwin (BCW): the lending platform Celsius conceals losses of 35000 eth or insolvency
- Suspended else
- The registration password of day 239/300 is 8~14 alphanumeric and punctuation, and at least 2 checks are included
- 【每日一题】729. 我的日程安排表 I
- How to translate biomedical instructions in English
猜你喜欢
基于PyTorch和Fast RCNN快速实现目标识别
Facebook AI & Oxford proposed a video transformer with "track attention" to perform SOTA in video action recognition tasks
How much is the price for the seal of the certificate
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
How to convert flv file to MP4 file? A simple solution
LeetCode每日一题(971. Flip Binary Tree To Match Preorder Traversal)
我的创作纪念日
After working for 10 years, I changed to a programmer. Now I'm 35 + years old and I'm not anxious
Leetcode - 152 product maximum subarray
CS通过(CDN+证书)powershell上线详细版
随机推荐
At the age of 26, I changed my career from finance to software testing. After four years of precipitation, I have been a 25K Test Development Engineer
In English translation of papers, how to do a good translation?
[brush questions] how can we correctly meet the interview?
Data security -- 13 -- data security lifecycle management
云上有AI,让地球科学研究更省力
mysql的基础命令
Wish Dragon Boat Festival is happy
Introduction and underlying analysis of regular expressions
Bitcoinwin (BCW): 借贷平台Celsius隐瞒亏损3.5万枚ETH 或资不抵债
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
Pallet management in SAP SD delivery process
How effective is the Chinese-English translation of international economic and trade contracts
Leetcode daily question (971. flip binary tree to match preorder traversal)
ROS学习_基础
Py06 dictionary mapping dictionary nested key does not exist test key sorting
基于购买行为数据对超市顾客进行市场细分(RFM模型)
Every API has its foundation when a building rises from the ground
Leetcode - 152 product maximum subarray
Brief introduction to the curriculum differences of colleges and universities at different levels of machine human major -ros1/ros2-
Today's summer solstice