コルーチンの原理1つのレッスンでのプロセススレッドコルーチンの原理の詳細な分析

ダウンロード:1つのレッスンでのコルーチンプロセススレッドコルーチン原理の詳細な分析

コルーチンの知識は多くのコースで言及されていますが、それは単なる味であり、詳細ではありません。市場で最初のコルーチン特別コースとして、このコースは基本から始まり、アプリケーションの原則とリンクし、コルーチンの原則を理解しやすくします。豊富なコースケースを組み合わせ、着陸の練習にPython言語を使用します。ただし、Java、Go、PHPのいずれで開発していても、このコースを通じてコルーチンの原則を習得できるという1つの法則は普遍的です。ジュニアおよびミドルレベルの開発には、高性能開発の学習を開始するのに非常に適したコースです。

群衆に適してい
ます。プロセス、スレッド、およびコルーチンの基本原則を習得し
たい学生は、ビジネスのボトルネックを突破し、プロジェクトの同時実行性を向上させ
たいと考えています。質問をしたいエンジニアは混乱しています。コルーチンを体系的に整理したい学生基本的なPython構文とバックエンドを使用
するに
知識が必要です
。プロジェクトの経験
ILvoid access(int x){//ルートノードからxへのパスを開きます。xは最も深い
for(R y = 0; x; x = fa(y = x)){
splay(x)、rs(x)= y、pushup(x);
}
}
Make_root(x):xをルートノードに変換します

IL void makeroot(int x){// xを元のツリーのルートに変更し
ますaccess(x)、splay(x)、Rev(x);
}
Find_root(x):xが

IL int findroot(int x){// xの元のツリーのルートを検索
access(x)、splay(x);
while(ls(x))pushdown(x)、x = ls(x);
return x ;
}
Spilt(x、y):xからyへのパスを実際のエッジパスに変換します

IL void split(int x、int y){// y xyパスに関する情報を維持する
makeroot(x)、access(y)、splay(y);
}
Link(x、y):x、yが接続されていない場合、次に(x、y)側に参加します

IL void link(int x、int y){
makeroot(x); if(findroot(y)!= x)fa(x)= y;
}
Cut(x、y):xとyの間にエッジがある場合、エッジを削除します

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):xがスプレイのルートノードであるかどうかを判別します

IL int nroot(int x)// xがルートではないことを明確にするために1を返し、xがルートであることを明確にするために0を返す
{return ls(fa(x))== x || rs(fa(x)) == x;}
P3690【テンプレート】リンクカットツリー(ダイナミックツリー)
愛らしい新コード〜Yuチームから学んだコード風

![]()![]() `` `
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)[X] .CH [1]
6の#define FA(X)[X]の.Fa
7
名前空間stdを使用して8。
9 const int N = 1e5 + 5、inf = 0x3f3f3f3f;
10
11 IL int read(){
12 int f = 1;
13文字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リターンresf;
18}
19
20 int n、m;
21 struct hh {
22 int ch [2]、fa、val、rev、sum;
23} a [N];


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プッシュダウン(x);
42}
43
44 IL voidrotate(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){// xを回転スプレイのルート
53pushall(x);
54 while(nroot(x)){
55 int y = fa(x);
56 if(nroot(y))rotate(chk(x)^ chk(y)?x: y);
57rotate(x);
58}
59}
60
61 IL void access(int x){//ルートノードからxへのパスを開きます。xは最も深い
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){// xをのルートに変更元のツリー68access(x)、splay
(x)、Rev(x);
69}
70
71 IL int findroot(int x){// xの元のツリーのルートを検索72access
(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維護xyP目上的信息
78makeroot(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は0を返します。
102}

おすすめ

転載: blog.51cto.com/15134648/2665119