ACM特定演算法的卡常優化

2021-09-23 08:04:42 字數 1230 閱讀 8540

今天做一道樹鏈剖分的題目,發現被卡常了,於是修改了很久,列印出執行時間,發現有這3個地方對常數的影響特比大

1. i/o:           

用輸入外掛程式所消耗的時間大概是用關同步+tie的cin的一半

測試:輸入了1e5*3的資料,cin用了0.2s,in用了0.1s

2. vector/鏈式前向星

不得不說cache友好真的是強

1e5條帶權邊,

存圖方式

存圖時間

dfs耗時

vector+push_back

0.70.2

vector+   (++cnt)

0.50.2

別人的鏈式前向星

0.30.05

我的鏈式前向星

0.20.03

3.vector優化

從上表也可以看出,事先resize()掉vector可以防止中途重新分配記憶體,可以加速,但好像效果也不是很明顯,現在就先不管了吧

4.線段樹優化

找到了2種update和2種query的寫法

void update(int o, int l, int r, int v)//區間加v

//找到邊緣

pushdown(o);

update(ls, max(e[ls].l, l), min(r, mid), v);

update(rs, max(mid + 1, l), min(e[rs].r, r), v);

pushup(o);

}void update2(int o, int l, int r, int v)//單點加v

if (max(l, e[o].l) > min(r, e[o].r))return;//捨棄

pushdown(o);

update2(ls, l, r, v);

update2(rs, l, r, v);

pushup(o);

}

以及query

ll query(int o, int l, int r)//done

ll query2(int o,int l,int r)

ll query3(int o,int l,int r)

這裡還加了1種,以上三種,比較常見的是2和3,1是我寫的,是2和3的折衷,其實效率不高,寫起來雖然比2好但不如3

效率:2>1>3

好寫:3>1>2

特定容器演算法

與其他容器不同,鍊錶型別list與forward list定義了幾個成員函式形式的演算法,如下表所示。特別是,它們定義了獨有的sort merge remove reverse和unique。通用版本的sort要求隨機訪問迭代器,因此不能用於list和forward list,因為這兩個型別分別提供...

特定容器演算法

與其他容器不同,鍊錶型別 list 和 forward list 定義了幾個成員函式形式的演算法 對於list和forward list,應該優先使用成員函式版本的演算法而不是通用演算法。鍊錶型別還定義了splice演算法,此演算法是鍊錶資料結構所特有的,因此不需要通用版本 多數鍊錶特有的演算法都與...

10 6 特定容器演算法

與其他容器不同,鍊錶型別list和 forward list定義了幾個成員函式形式的演算法,如下表所示。特別是,它們定義了獨有的sort merge remove reverse和unique。通用版本的sort要求隨機訪問迭代器,因此不能用於list和forward list,因為這兩個型別分別提...