今天做一道樹鏈剖分的題目,發現被卡常了,於是修改了很久,列印出執行時間,發現有這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,因為這兩個型別分別提...