The principle of coroutine in-depth analysis of the process thread coroutine principle in one lesson

download: In -depth analysis of the principle of coroutine process thread coroutine principle in one lesson

The knowledge of coroutines is mentioned in many courses, but it's just a taste, not in-depth. As the first coroutine special course on the market, this course will start from the basics, link up with the application principles, and make it easier to understand the principles of coroutines. It combines rich course cases and uses the Python language for landing practice. But one law is universal, no matter if you are developing in Java, Go or PHP, you can master the principle of coroutine through this course. For junior and middle-level development, it is a very suitable course for starting to learn high-performance development.

Suitable for the crowd
. Students who
want to master the underlying principles of processes, threads, and coroutines want to break through business bottlenecks and improve project concurrency. Engineers
who want to ask for a question are confused. Students who want to systematically sort out coroutine knowledge are
required to
have a basic Python syntax and
a backend Project experience
IL void access(int x) {//Open up the path from the root node to x, x is the deepest
for(R y=0; x; x=fa(y=x)) {
splay(x),rs(x )=y,pushup(x);
}
}
Make_root(x): Turn x into the root node

IL void makeroot(int x) {//Change x to the root of the original tree
access(x),splay(x),Rev(x);
}
Find_root(x): find the root node where x is

IL int findroot(int x) {//Find the root of the original tree of
x access(x),splay(x);
while(ls(x)) pushdown(x),x=ls(x);
return x;
}
Spilt(x,y): Turn the path from x to y into a real-edge path

IL void split(int x,int y) {//y Maintain information on the xy path
makeroot(x),access(y),splay(y);
}
Link(x,y): If x,y are not connected, Then join the (x, y) side

IL void link(int x,int y) {
makeroot(x);if(findroot(y)!=x) fa(x)=y;
}
Cut(x,y): If there is an edge between x and y, Delete the edge

IL void cut(int x,int y) {
split(x,y);
if(fa(x)==y&&rs(x)==0) fa(x)=ls(y)=0,pushup(y) ;
}
Isroot(x): Determine whether x is the root node of the splay

IL int nroot(int x) //return 1 to clarify that x is not the root, return 0 to clarify that x is the root
{return ls(fa(x))==x||rs(fa(x))==x;}
P3690 【 Template] Link Cut Tree (Dynamic Tree)
Adorable New Code ~ Code Wind Learned From Yu Team

![]()![]()```
1 #include<bits/stdc++.h>
2 #define IL inline
3 #define R register int
4 #define ls(x) a[x].ch[0]
5 #define rs(x) a[x].ch[1]
6 #define fa(x) a[x].fa
7
8 using namespace std;
9 const int N=1e5+5,inf=0x3f3f3f3f;
10
11 IL int read() {
12 int f=1;
13 char ch;
14 while((ch=getchar())<'0'||ch>'9') if(ch=='-') f=-1;
15 int res=ch-'0';
16 while((ch=getchar())>='0'&&ch<='9') res=res10+ch-'0';
17 return resf;
18 }
19
20 int n,m;
21 struct hh {
22 int ch[2],fa,val,rev,sum;
23 } a[N];25 IL int chk (int x) {return x == rs (fa (x));}
24

26 IL void Rev(int x) {swap(ls(x),rs(x));a[x].rev^=1;}
27 IL void pushup(int x) {a[x].sum=a[ls(x)].sum^a[rs(x)].sum^a[x].val;}
28 IL int nroot(int x) //返回1阐明x不是根,返回0阐明x是根
29 {return ls(fa(x))==x||rs(fa(x))==x;}
30
31 IL void pushdown(int x) {
32 if(a[x].rev) {
33 a[x].rev=0;
34 if(ls(x)) Rev(ls(x));
35 if(rs(x)) Rev(rs(x));
36 }
37 }
38
39 IL void pushall(int x) {
40 if(nroot(x)) pushall(fa(x));
41 pushdown(x);
42 }
43
44 IL void rotate(int x) {
45 int y=fa(x),z=fa(y),k=chk(x),w=a[x].ch[k^1];
46 if(nroot(y)) a[z].ch[chk(y)]=x;fa(x)=z;
47 if(w) fa(w)=y;a[y].ch[k]=w;
48 fa(y)=x;a[x].ch[k^1]=y;
49 pushup(y);pushup(x);
50}
51
52 IL void splay(int x) {//turn x To the root of splay
53 pushall(x);
54 while(nroot(x)) {
55 int y=fa(x);
56 if(nroot(y)) rotate(chk(x)^chk(y)?x: y);
57 rotate(x);
58}
59}
60
61 IL void access(int x) {//Open up the path from the root node to x, x is the deepest
62 for(R y=0; x; x=fa( y=x)) {
63 splay(x),rs(x)=y,pushup(x);
64}
65}
66
67 IL void makeroot(int x) {//change x to the root of the original tree
68 access (x),splay(x),Rev(x);
69}
70
71 IL int findroot(int x) {//Find the root of the original tree of
x 72 access(x),splay(x);
73 while(ls (x)) pushdown(x),x=ls(x);
74 return x;
75 }
76
77 IL void split(int x,int y) {//y維護x-y途径上的信息
78 makeroot(x),access(y),splay(y);
79 }
80
81 IL void link(int x,int y) {
82 makeroot(x);if(findroot(y)!=x) fa(x)=y;
83 }
84
85 IL void cut(int x,int y) {
86 split(x,y);
87 if(fa(x)==y&&rs(x)==0) fa(x)=ls(y)=0,pushup(y);
88 }
89
90 int main() {
91 n=read();
92 m=read();
93 for(R i=1; i<=n; ++i) a[i].val=a[i].sum=read();
94 while(m--) {
95 int op=read(),x=read(),y=read();
96 if(!op) split(x,y),printf("%d\n",a[y].sum);
97 else if(op==1) link(x,y);
98 else if(op==2) cut(x,y);
99 else makeroot(x),a[x].val=y,pushup(x);
100 }
101 return 0;
102 }

Guess you like

Origin blog.51cto.com/15134648/2665119