三大平衡樹(Treap + Splay + SBT)總結+模板

Treap樹

  核心是 利用隨機數的二叉排序樹的各種操作復雜度平均為O(lgn)

Treap模板:

#include <cstdio>
#include <cstring>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <cmath>
#include <utility>
#include <vector>
#include <queue>
#include <map>
#include <set>
#define max(x,y) ((x)>(y)?(x):(y))
#define min(x,y) ((x)>(y)?(y):(x))
#define INF 0x3f3f3f3f
#define MAXN 100005using namespace std;int cnt=1,rt=0; //節點編號從1開始struct Tree
{int key, size, pri, son[2]; //保證父親的pri大于兒子的privoid set(int x, int y, int z){key=x;pri=y;size=z;son[0]=son[1]=0;}
}T[MAXN];void rotate(int p, int &x)
{int y=T[x].son[!p];T[x].size=T[x].size-T[y].size+T[T[y].son[p]].size;T[x].son[!p]=T[y].son[p];T[y].size=T[y].size-T[T[y].son[p]].size+T[x].size;T[y].son[p]=x;x=y;
}void ins(int key, int &x)
{if(x == 0)T[x = cnt++].set(key, rand(), 1);else{T[x].size++;int p=key < T[x].key;ins(key, T[x].son[!p]);if(T[x].pri < T[T[x].son[!p]].pri)rotate(p, x);}
}void del(int key, int &x) //刪除值為key的節點
{if(T[x].key == key){if(T[x].son[0] && T[x].son[1]){int p=T[T[x].son[0]].pri > T[T[x].son[1]].pri;rotate(p, x);del(key, T[x].son[p]);}else{if(!T[x].son[0])x=T[x].son[1];elsex=T[x].son[0];}}else{T[x].size--;int p=T[x].key > key;del(key, T[x].son[!p]);}
}int find(int p, int &x) //找出第p小的節點的編號
{if(p == T[T[x].son[0]].size+1)return x;if(p > T[T[x].son[0]].size+1)find(p-T[T[x].son[0]].size-1, T[x].son[1]);elsefind(p, T[x].son[0]);
}int find_NoLarger(int key, int &x) //找出值小于等于key的節點個數
{if(x == 0)return 0;if(T[x].key <= key)return T[T[x].son[0]].size+1+find_NoLarger(key, T[x].son[1]);elsereturn find_NoLarger(key, T[x].son[0]);    
}
View Code

相關題解:

POJ 3481 treap

POJ 1442 treap

POJ 2352 treap

?

?

Splay Tree(伸展樹)

  核心就是 過程Splay(x, y),即將x節點轉移到y節點的子節點上面(其中y是x的祖先)。

  利用其中雙旋的優勢能夠保證查詢復雜度均攤為O(lgn)

  一開始理解有些困難,其實實際上不做深入的理解就是,雙旋的過程就是一個建立相對平衡的二叉樹的一個過程。

  》對于二叉樹,最極端的情況就是線性插入,使得整棵二叉樹退化為一條鏈。比如你查詢鏈的最后一個節點,之后再次查詢第一個節點。

    1)若只是單旋通過Splay(x, 0)將最后一個節點移動到根節點,需要O(n)復雜度,而查詢第一個節點時又需要O(n)復雜度,來來往往就退化成一條鏈了。

    2)若是雙旋Splay(x, 0)將最后一個節點移動到根節點上時,移動過程中建立起了相對平衡的二叉樹,需要O(n),也就是查詢第一個節點時,大概是需要O(lgn)復雜度。這就降低了復雜度。可以證明,總的每個操作的均攤復雜度是O(lgn)。

    具體證明可以參見 楊思雨《伸展樹的基本操作與應用》

?

I 用于維護單調隊列:(以key為維護對象保證單調)

常用版:(支持相同值)

Struct Tree{

  int key, size, fa, son[2];

}

void PushUp(int x);

void Rotate(int x, int p); //0左旋 1右旋

void Splay(int x, int To) //將x節點插入到To的子節點中

int find(int key) //返回值為key的節點 若無返回0 若有將其轉移到根處

int prev() //返回比根值小的最大值 若無返回0 若有將其轉移到根處

int succ() //返回比根值大的最小值 若無返回0 若有將其轉移到根處

void Insert(int key) //插入key 并且將該節點轉移到根處

void Delete(int key) //刪除值為key的節點 若有重點只刪其中一個 x的前驅移動到根處

int GetPth(int p) //獲得第p小的節點 并將其轉移到根處

int GetRank(int key) //獲得值<=key的節點個數 并將其轉移到根處 若<key只需將<=換為<

模板:
int cnt=1, rt=0;struct Tree
{int key, size, fa, son[2];void set(int _key, int _size, int _fa){key=_key;size=_size;fa=_fa;son[0]=son[1]=0;}
}T[MAXN];inline void PushUp(int x)
{T[x].size=T[T[x].son[0]].size+T[T[x].son[1]].size+1;
}inline void Rotate(int x, int p) //0左旋 1右旋
{int y=T[x].fa;T[y].son[!p]=T[x].son[p];T[T[x].son[p]].fa=y;T[x].fa=T[y].fa;if(T[x].fa)T[T[x].fa].son[T[T[x].fa].son[1] == y]=x;T[x].son[p]=y;T[y].fa=x;PushUp(y);PushUp(x);
}void Splay(int x, int To) //將x節點插入到To的子節點中
{while(T[x].fa != To){if(T[T[x].fa].fa == To)Rotate(x, T[T[x].fa].son[0] == x);else{int y=T[x].fa, z=T[y].fa;int p=(T[z].son[0] == y);if(T[y].son[p] == x)Rotate(x, !p), Rotate(x, p); //之字旋elseRotate(y, p), Rotate(x, p); //一字旋
        }}if(To == 0) rt=x;
}int find(int key) //返回值為key的節點 若無返回0 若有將其轉移到根處
{int x=rt;while(x && T[x].key != key)x=T[x].son[key > T[x].key];if(x) Splay(x, 0);return x;
}int prev() //返回比根值小的最大值 若無返回0 若有將其轉移到根處
{int x=T[rt].son[0];if(!x) return 0;while(T[x].son[1])x=T[x].son[1];Splay(x, 0);return x;
}int succ() //返回比根值大的最小值 若無返回0 若有將其轉移到根處
{int x=T[rt].son[1];if(!x) return 0;while(T[x].son[0])x=T[x].son[0];Splay(x, 0);return x;
}void Insert(int key) //插入key 并且將該節點轉移到根處
{if(!rt)T[rt = cnt++].set(key, 1, 0);else{int x=rt, y=0;while(x){y=x;x=T[x].son[key > T[x].key];}T[x = cnt++].set(key, 1, y);T[y].son[key > T[y].key]=x;Splay(x, 0);}
}void Delete(int key) //刪除值為key的節點 若有重點只刪其中一個 x的前驅移動到根處
{int x=find(key);if(!x) return;int y=T[x].son[0];while(T[y].son[1])y=T[y].son[1];int z=T[x].son[1];while(T[z].son[0])z=T[z].son[0];if(!y && !z){rt=0;return;}if(!y){Splay(z, 0);T[z].son[0]=0;PushUp(z);return;}if(!z){Splay(y, 0);T[y].son[1]=0;PushUp(y);return;}Splay(y, 0);Splay(z, y);T[z].son[0]=0;PushUp(z);PushUp(y);
}int GetPth(int p) //獲得第p小的節點 并將其轉移到根處
{if(!rt) return 0;int x=rt, ret=0;while(x){if(p == T[T[x].son[0]].size+1)break;if(p>T[T[x].son[0]].size+1){p-=T[T[x].son[0]].size+1;x=T[x].son[1];}elsex=T[x].son[0];}Splay(x, 0);return x;
}int GetRank(int key) //獲得值<=key的節點個數 并將其轉移到根處 若<key只需將<=換為<
{if(!rt) return 0;int x=rt, ret=0, y;while(x){y=x;if(T[x].key <= key){ret+=T[T[x].son[0]].size+1;x=T[x].son[1];}elsex=T[x].son[0];}Splay(y, 0);return ret;
}
View Code

?

完全版:(支持相同值,支持區間刪除,支持懶惰標記)

Struct Tree{

  int key, num, size, fa, son[2];

}

void PushUp(int x);

void PushDown(int x);

int Newnode(int key, int fa); //新建一個節點并返回

void Rotate(int x, int p);?//0左旋 1右旋

void Splay(int x, int To);?//將x節點移動到To的子節點中

int GetPth(int p, int To); //返回第p小的節點 并移動到To的子節點中

int Find(int key); //返回值為key的節點 若無返回0 若有將其轉移到根處

int Prev(); //返回根節點的前驅

int Succ(); //返回根結點的后繼

void Insert(int key); //插入key值

void Delete(int key); //刪除值為key的節點

int GetRank(int key); //獲得值<=key的節點個數

void Delete(int l, int r); //刪除值在[l, r]中的節點

模板:
int cnt, rt;
int Add[MAXN];struct Tree{int key, num, size, fa, son[2];
}T[MAXN];inline void PushUp(int x)
{T[x].size=T[T[x].son[0]].size+T[T[x].son[1]].size+T[x].num;
}inline void PushDown(int x)
{if(Add[x]){if(T[x].son[0]){T[T[x].son[0]].key+=Add[x];Add[T[x].son[0]]+=Add[x];}if(T[x].son[1]){T[T[x].son[1]].key+=Add[x];Add[T[x].son[1]]+=Add[x];}Add[x]=0;}
}inline int Newnode(int key, int fa) //新建一個節點并返回
{++cnt;T[cnt].key=key;T[cnt].num=T[cnt].size=1;T[cnt].fa=fa;T[cnt].son[0]=T[cnt].son[1]=0;return cnt;
}inline void Rotate(int x, int p) //0左旋 1右旋
{int y=T[x].fa;PushDown(y);PushDown(x);T[y].son[!p]=T[x].son[p];T[T[x].son[p]].fa=y;T[x].fa=T[y].fa;if(T[x].fa)T[T[x].fa].son[T[T[x].fa].son[1] == y]=x;T[x].son[p]=y;T[y].fa=x;PushUp(y);PushUp(x);
}void Splay(int x, int To) //將x節點移動到To的子節點中
{while(T[x].fa != To){if(T[T[x].fa].fa == To)Rotate(x, T[T[x].fa].son[0] == x);else{int y=T[x].fa, z=T[y].fa;int p=(T[z].son[0] == y);if(T[y].son[p] == x)Rotate(x, !p), Rotate(x, p); //之字旋elseRotate(y, p), Rotate(x, p); //一字旋
        }}if(To == 0) rt=x;
}int GetPth(int p, int To) //返回第p小的節點 并移動到To的子節點中
{if(!rt || p > T[rt].size) return 0;int x=rt;while(x){PushDown(x);if(p >= T[T[x].son[0]].size+1 && p <= T[T[x].son[0]].size+T[x].num)break;if(p > T[T[x].son[0]].size+T[x].num){p-=T[T[x].son[0]].size+T[x].num;x=T[x].son[1];}elsex=T[x].son[0];}Splay(x, 0);return x;
}int Find(int key) //返回值為key的節點 若無返回0 若有將其轉移到根處
{if(!rt) return 0;int x=rt;while(x){PushDown(x);if(T[x].key == key) break;x=T[x].son[key > T[x].key];}if(x) Splay(x, 0);return x;
}int Prev() //返回根節點的前驅 非重點
{if(!rt || !T[rt].son[0]) return 0;int x=T[rt].son[0];while(T[x].son[1]){PushDown(x);x=T[x].son[1];}Splay(x, 0);return x;
}int Succ() //返回根結點的后繼 非重點
{if(!rt || !T[rt].son[1]) return 0;int x=T[rt].son[1];while(T[x].son[0]){PushDown(x);x=T[x].son[0];}Splay(x, 0);return x;
}void Insert(int key) //插入key值
{if(!rt)rt=Newnode(key, 0);else{int x=rt, y=0;while(x){PushDown(x);y=x;if(T[x].key == key){T[x].num++;T[x].size++;break;}T[x].size++;x=T[x].son[key > T[x].key];}if(!x)x=T[y].son[key > T[y].key]=Newnode(key, y);Splay(x, 0);}
}void Delete(int key) //刪除值為key的節點1個
{int x=Find(key);if(!x) return;if(T[x].num>1){T[x].num--;PushUp(x);return;}int y=T[x].son[0];while(T[y].son[1])y=T[y].son[1];int z=T[x].son[1];while(T[z].son[0])z=T[z].son[0];if(!y && !z){rt=0;return;}if(!y){Splay(z, 0);T[z].son[0]=0;PushUp(z);return;}if(!z){Splay(y, 0);T[y].son[1]=0;PushUp(y);return;}Splay(y, 0);Splay(z, y);T[z].son[0]=0;PushUp(z);PushUp(y);
}int GetRank(int key) //獲得值<=key的節點個數
{if(!Find(key)){Insert(key);int tmp=T[T[rt].son[0]].size;Delete(key);return tmp;}elsereturn T[T[rt].son[0]].size+T[rt].num;
}void Delete(int l, int r) //刪除值在[l, r]中的所有節點 l!=r
{if(!Find(l)) Insert(l);int p=Prev();if(!Find(r)) Insert(r);int q=Succ();if(!p && !q){rt=0;return;}if(!p){T[rt].son[0]=0;PushUp(rt);return;}if(!q){Splay(p, 0);T[rt].son[1]=0;PushUp(rt);return;}Splay(p, q);T[p].son[1]=0;PushUp(p);PushUp(q);
}
View Code

(經測NOI2004郁悶的出納員 POJ3481 POJ2352 POJ1442)

速度相對來說都還不錯,POJ這些都3~500ms,郁悶的出納員900多ms

?

相關題解:

HNOI 2002 營業額統計

POJ 3481 splay

POJ 2352 splay

POJ 1442 splay

NOI2004 郁悶的出納員?

?

II 用于維護序列:(以序列下標為對象維護,相當于對區間操作)(能夠完成線段樹的操作及其不能完成的操作)

?Struct Tree{

  int key, sum, size, fa, son[2];

}

支持操作:

void PushUp(int x);

void PushDown(int x);

int MakeTree(int l, int r, int a[]); //新建一個子樹返回根節點

void Rotate(int x, int p);?//0左旋 1右旋

void Splay(int x, int To);?//將x節點移動到To的子節點中

int Select(int p, int To); //將第p個數移動到To的子節點中 并返回該節點

int Find(int key); //返回值為key的節點 若無返回0 若有將其轉移到根處

int Prev(); //返回根節點的前驅

int Succ(); //返回根結點的后繼

void Insert(int p, int l, int r, int a[]) //將a[l .. r]的數插入到下標為p后面

void Delete(int l, int r); //刪除區間[l, r]中的節點

int Query(int l, int r); //返回[l, r]的和

待補充。。

?

Size Balance Tree

  和上述兩種二叉樹比起來,SBT可能是最像真正平衡二叉樹吧。

  SBT能夠保證樹的高度在lgn,這樣對于插入,刪除操作都能夠準確保證時間復雜度在O(lgn)

  Maintain操作事實上理解起來也是挺簡單的,至于證明參見CQF神牛的《SBT》

?

int cnt, rt;struct Tree
{int key, size, son[2];
}T[MAXN];inline void PushUp(int x)
{T[x].size=T[T[x].son[0]].size+T[T[x].son[1]].size+1;
}inline int Newnode(int key)
{++cnt;T[cnt].key=key;T[cnt].size=1;T[cnt].son[0]=T[cnt].son[1]=0;return cnt;
}void Rotate(int p, int &x)
{int y=T[x].son[!p];T[x].son[!p]=T[y].son[p];T[y].son[p]=x;PushUp(x);PushUp(y);x=y;
}void Maintain(int &x, int p) //維護SBT的!p子樹
{if(T[T[T[x].son[p]].son[p]].size > T[T[x].son[!p]].size)Rotate(!p, x);else if(T[T[T[x].son[p]].son[!p]].size > T[T[x].son[!p]].size)Rotate(p, T[x].son[p]), Rotate(!p, x);else return;Maintain(T[x].son[0], 0);Maintain(T[x].son[1], 1);Maintain(x, 0);Maintain(x, 1);
}inline int Prev() //返回比根值小的最大值 若無返回0
{int x=T[rt].son[0];if(!x) return 0;while(T[x].son[1])x=T[x].son[1];return x;
}inline int Succ() //返回比根值大的最小值 若無返回0
{int x=T[rt].son[1];if(!x) return 0;while(T[x].son[0])x=T[x].son[0];return x;
}void Insert(int key, int &x)
{if(!x) x=Newnode(key);else{T[x].size++;Insert(key, T[x].son[key > T[x].key]);Maintain(x, key > T[x].key);}
}bool Delete(int key, int &x) //刪除值為key的節點 key可以不存在
{if(!x) return 0;if(T[x].key == key){if(!T[x].son[0]){x=T[x].son[1];return 1;}if(!T[x].son[1]){x=T[x].son[0];return 1;}int y=Prev();T[x].size--;return Delete(T[x].key, T[x].son[0]);}elseif(Delete(key, T[x].son[key > T[x].key])){T[x].size--;return 1;}
}int GetPth(int p, int &x) //返回第p小的節點
{if(!x) return 0;if(p == T[T[x].son[0]].size+1)return x;if(p > T[T[x].son[0]].size+1)return GetPth(p-T[T[x].son[0]].size-1, T[x].son[1]);elsereturn GetPth(p, T[x].son[0]);
}int GetRank(int key, int &x) //找出值<=key的節點個數
{if(!x) return 0;if(T[x].key <= key)return T[T[x].son[0]].size+1+GetRank(key, T[x].son[1]);elsereturn GetRank(key, T[x].son[0]);
}
View Code

?

相關題解:

POJ 3481 SBT做法

?

上述題均為用于測試平衡樹基本操作的題目。

提高題:(暫時未寫)

[NOI2005]維修數列

[POJ3580]SuperMemo

[HNOI2004]寵物收養所

?

轉載于:https://www.cnblogs.com/Mathics/p/3971220.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/376647.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/376647.shtml
英文地址,請注明出處:http://en.pswp.cn/news/376647.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

mysqld進程 ut_delay 占用率過高

采用性能分析工具perf top -p mysqld進程 在測試mysql數據庫時&#xff0c;用perf top如果看到熱點函數是ut_delay或者_raw_spin_lock的話&#xff0c;說明鎖爭用比較嚴重。 ut_delay這是innodb的一個自旋瑣。也就是說&#xff0c;在這里由于鎖等待&#xff0c;innodb不停地在…

TClientDataSet使用要點

TClientDataSet控件繼承自TDataSet&#xff0c;其數據存儲文件格式擴展名為 .cds&#xff0c;是基于文件型數據存儲和操作的控件。該控件封裝了對數據進行操作處理的接口和功能&#xff0c;而本身并不依賴上述幾種數據庫驅動程序&#xff0c;基本上能滿足單機"瘦"數據…

滑動窗口在重構數據集的作用

step1&#xff1a;使用滑動窗口重構數據集 給定時間序列數據集的數字序列&#xff0c;我們可以將數據重構為看起來像監督學習問題。 我們可以通過使用以前的時間步作為輸入變量并使用下一個時間步作為輸出變量來做到這一點。 通過觀察重構后的數據集與原本的時間序列&…

sliverlight - Unhandled Error in Silverlight Application錯誤

使用firebug控制臺輸出錯誤&#xff1a; Unhandled Error in Silverlight Application 查詢“GetFlow_Process”的 Load 操作失敗。遠程服務器返回了錯誤: NotFound。 位于 System.ServiceModel.DomainServices.Client.OperationBase.Complete(Exception error) 位于 System.S…

前向驗證對于模型的更新作用

首先&#xff0c;讓我們看一個小的單變量時間序列數據&#xff0c;我們將用作上下文來理解這三種回測方法&#xff1a;太陽黑子數據集。該數據集描述了剛剛超過 230 年&#xff08;1749-1983 年&#xff09;觀察到的太陽黑子數量的每月計數。 數據集顯示了季節之間差異很大的…

2014年9月21日_隨筆,jdic,ETL,groovy,Nutz好多東西想學

&#xff08;1&#xff09;老媽十一要回老家&#xff0c;才突然發現買票好難啊。有親朋很重要 &#xff08;2&#xff09;這周我做了什么。jdic,ETL,groovy, Nutz好多東西想學。 Nutz開發成員專訪、Nutz優酷視頻(演講)、Nutz 入門教程、 &#xff08;3&#xff09;想改變&#…

PHP-面向對象(八)

1、多態的介紹與優勢 多態性是繼抽象和繼承后&#xff0c;面向對象語言的第三個特征。從字面上理解&#xff0c;多態的意思是“多種形態”&#xff0c;簡單來說&#xff0c;多態是具有表現多種形態的能力的特征&#xff0c;在OO中是指“語言具有根據對象的類型以不同方式處理。…

雙指數平滑中參數對于預測模型的影響

先看看α 在β一致的情況下&#xff0c;α越小&#xff0c;模型越滯后。 再看看β 在α一致的情況下&#xff0c;β越大&#xff0c;模型對于趨勢的預測更敏銳。

SQL 性能不佳的幾個原因

SQL 性能不佳的幾個原因 ?不準確的統計數據?差勁的索引?差勁的查詢設計 ?差勁的執行計劃&#xff0c;通常是由不正確的參數引起的?過度阻塞和死鎖 ?非基于集合的操作?不良數據庫設計 ?過度碎片 ?不能重復使用執行計劃 ?查詢頻繁重編譯 ?不當使用游標 ?數據庫日志的…

分頁查詢

分頁查詢算是比較常用的一個查詢了在DAO層主要是查兩個數據第一個總條數第二個要查詢起始記錄數到查詢的條數當第一次點擊查詢時候(非下一頁時Page類里面預設的就是 index就是0 pageSize是預設值當點擊下一頁的時候 index 和 pageSize帶的就是頁面上面給的值了分頁的頁面一般的…

TypeError: Object of type ‘datetime‘ is not JSON serializable

python中這個錯誤的原因是json.dumps無法對字典中的datetime時間格式數據進行轉化&#xff0c;dumps的原功能是將dict轉化為str格式&#xff0c;不支持轉化時間. 所以請這樣使用&#xff1a; json.dumps(response_data, defaultstr)

oracle問題

ORA-01031: insufficient privileges 用戶沒有權限&#xff0c;給它賦予角色轉載于:https://www.cnblogs.com/50614090/p/3986880.html

me23n去價格

SELECT knumv kposn AS ebelp kschl kbetr kpein kwert INTO CORRESPONDING FIELDS OF TABLE gt_konv FROM konv FOR ALL ENTRIES IN gt_ekpo WHERE knumv gt_ekpo-knumv AND kinak EQ AND kschl IN (PB00,PBXX,P101).轉載于:…

Fix “Windows cannot access the specified device path or file” Error

http://helpdeskgeek.com/help-desk/windows-cannot-access-the-specified-device-path-or-file/ Method 1 – Windows Server 2003 Terminal Services Firstly, if you’re running into this issue on a Windows Server box running Terminal Services, your problem can be …

使用Bootstrap-table創建表單,并且與flask后臺進行數據交互

文章目錄引用css和js使用htmljavascriptflaskmysql參考引用css和js Bootstrap-table為這些文件提供了 CDN 的支持&#xff0c;所以不需要下載.js .css文件就可以直接用了&#xff0c;十分方便 <!-- Latest compiled and minified CSS --> <link rel"stylesheet…

php編碼規則(一)

---恢復內容開始--- <轉載自己整理> GNU C 庫&#xff08;GNU C Library&#xff0c;又稱為glibc&#xff09;是一種按照LGPL許可協議發布的&#xff0c;公開源代碼的&#xff0c;免費的&#xff0c;方便從網絡下載的C的編譯程序。 GNU C運行期庫&#xff0c;是一種C函數…

重新想象 Windows 8.1 Store Apps (89) - 通信的新特性: 下載數據, 上傳數據, 上傳文件...

重新想象 Windows 8.1 Store Apps (89) - 通信的新特性: 下載數據, 上傳數據, 上傳文件 原文:重新想象 Windows 8.1 Store Apps (89) - 通信的新特性: 下載數據, 上傳數據, 上傳文件[源碼下載] 重新想象 Windows 8.1 Store Apps (89) - 通信的新特性: 下載數據, 上傳數據, 上傳…

【經驗貼】smartCarers在比賽后如何獲取更好的發展

博主聯系方式: QQ:1540984562 QQ交流群:892023501 群里會有往屆的smarters和電賽選手,群里也會不時分享一些有用的資料,有問題可以在群里多問問。 由于最近專欄開了付費,群友讓更新一些經驗貼,于是有了這篇文章。 一般來說,比賽完了之后是大二結束的暑假,此時有這么幾條…

isset()和empty()到底區別是什么。

一招鮮吃遍天&#xff0c;自從看了燕十八關于PHP變量內部機制的那課&#xff0c;解釋了一些很久的疑惑&#xff0c;知其然還知其所以然&#xff0c;果然是學習的最佳途徑&#xff0c;比背下來要重要N倍。 我們知道一個變量有變量表的位置&#xff0c;然后他指向自己的內存地址&…

html清除圖片緩存

img.src ?t(new Date()); 如&#xff1a; <img id "5" src"../../../pics/prod_146/__INLINE__user_nums_cmp_146.png?t"(new Date()) width"1024">