經常在參觀大佬的博客的時候看到這種寫法,百思不得其解, “0x3f3f3f3f ”是什麼?/*雖然,似乎,好像剛剛看過進制轉換……就當我選擇性失憶吧*/
-------------------
很多人可能設爲0x7fffffff,這個數的確是32-bit int的最大值,符號位爲0,其他的都是1
但在很多情況下,0x7fffffff會出現錯誤,比如溢出,這樣兩個無窮大數相加會變成負數,還有如在做dijkstra求最短路時,當做鬆弛操作,判斷if (d[u]+w[u][v]<d[v]) d[v]=d[u]+w[u][v]時,若u到v沒有路勁,w[u][v]=0x7fffffff,這樣d[u]+w[u][v]會變成負數,這就產生了錯誤。
爲了儘量避免以上的錯誤,我們可以改變無窮大的設定,可以將0x3f3f3f3f設爲無窮大,0x3f3f3f3f的10進製表示爲1061109567,這個數已達到10^9,足以表示無窮大,又0x3f3f3f3f+0x3f3f3f3f=2122219134,滿足無窮大+無窮大仍爲無窮大
當把無窮大設爲0x3f3f3f3f時,在做初始化時也很方便,比如在初始化數組a時,可以使用
Memset(a,0x3f,sizeof(a)),因爲0x3f3f3f3f的每個字節都是0x3f,如果使用0x7fffffff,需要循環賦值,耗費更多時間
----------------------------------------------------------------------------------------------------------------------
先放段代碼,然後有時間一個一個寫
#define lson 2*i
#define rson 2*i+1
#define LS l,mid,lson
#define RS mid+1,r,rson
#define UP(i,x,y) for(i=x;i<=y;i++)
#define DOWN(i,x,y) for(i=x;i>=y;i--)
#define MEM(a,x) memset(a,x,sizeof(a))
#define W(a) while(a)
#define gcd(a,b) __gcd(a,b)
#define LL long long
#define N 1000005
#define MOD 1000000007
#define INF 0x3f3f3f3f
#define EXP 1e-8
#define lowbit(x) (x&-x)