Google资深工程师深度讲解Go语言

mb605030acdfef5 · · 738 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

download:Google资深工程师深度讲解Go语言

Go作为专门为并发和大数据设计的语言,在编程界占据越来越重要的地位!不论是c/c++,php,java,重构首选语言就是Go~本次课程特邀谷歌资深工程师,将Go语言使用经验总结归纳,从Go语言基本语法到函数式编程、并发编程,最后构建分布式爬虫系统,步步深入,带你快速掌握Go语言!

适合人群及技术储备要求
如果你已经掌握了一门编程语言,想转型Go语言工程师,
或者是对Go的基础语法有简单的认识,想更深层次的了解Go语言
那么本门课程非常适合你
技术储备要求:
至少掌握一门编程语言
具有一定项目基础和工作经验者学习效果更佳
IL void 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維護x-y途径上的信息
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能否是所在splay的根節點

IL int nroot(int x) //返回1阐明x不是根,返回0阐明x是根
{return ls(fa(x))==x||rs(fa(x))==x;}
P3690 【模板】Link Cut Tree (動態樹)
萌新寫代码~码風跟喻隊學的

![]()![]()```
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];
24
25 IL int chk(int x) {return x==rs(fa(x));}
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) {//把x轉到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) {//打通從根節點到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變爲原樹的根
68 access(x),splay(x),Rev(x);
69 }
70
71 IL int findroot(int x) {//找到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 }


有疑问加站长微信联系(非本文作者)

本文来自:51CTO博客

感谢作者:mb605030acdfef5

查看原文:Google资深工程师深度讲解Go语言

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

738 次点击  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传