天梯賽賽前總結

永无岛發表於2024-04-20

某些函式後面有帶小括號的註解,小括號中各引數的順序就是傳入的引數的順序。

stl

  • queue
    宣告:queue name;(其他容器如無特別標註則宣告方式與此相同)

    函式:front,back,empty,size,push,pop,swap(c++11)

    比較運算子:==,<=,>=,<,>,!=:按照字典序比較兩個queue(c++20)

  • priority_queue
    函式:top,empty,size,push,pop,swap

  • stack
    函式:top,empty,size,push,pop,swap(c++11)

    比較運算子:==,<=,>=,<,>,!=:按照字典序比較兩個stack(c++20)

  • map/unordered_map
    宣告:map<first值型別,last值型別> name;

    函式:[], begin,end,rbegin,rend,empty,size,clear,insert,erase,find,lower_bound(返回指向首個不小於給定鍵的元素的迭代器 ),upper_bound

    tips:如果map的鍵值是一個struct,那麼需要定義比較(<)。定義方法:bool operator <(const item &a){return x < a.x}(以x升序),unordered_map則不需要定義比較;一定要使用mp.lower_bound()而不是lower_bound(),直接用lower_bound()時間複雜度是不對的。

  • set/multiset
    函式:begin,end,rbegin,rend,empty,size,clear,insert,erase,find,lower_bound,upper_bound

    tips:對於multiset,在erase時,如果只想擦除一個值的一個元素,不能使用erase(x),一個較好的實現方式是erase(find(x));一定要使用st.lower_bound()而不是lower_bound(),直接用lower_bound()時間複雜度是不對的。

  • vector
    函式:begin,end,rbegin,rend,empty,size,clear,insert(在pos前插入x/在pos前插入cnt個x),erase(擦除pos處的元素/擦除[first, last)處的元素),push_back,pop_back,lower_bound,upper_bound

    比較運算子:==,<=,>=,<,>,!=:按照字典序比較兩個vector(c++20中移除)

  • bitset
    函式:[],count,size,二進位制操作,set(pos,val),flip(pos)(翻轉指定位)

    宣告:bitset<長度> name。

bfs

注意每往佇列裡扔一個元素就要把vis標記為1,否則時間複雜度可能有問題。

字串

以 string 為模板。

  • size
  • insert:(在pos處插入cnt個ch)(在pos處插入s)
  • erase:(擦除pos處字元)(擦除從pos處開始的len個字元)
  • find:(查詢字串s在pos處之後的首次出現位置)返回值是首個字元的下標,如果沒有則返回s.npos
  • rfind:(查詢字串s在pos處之後的最後一次出現位置)返回值是首個字元的下標,如果沒有則返回s.npos
  • substr:(獲得從pos處開始的len個字元構成的字串)
  • 比較運算子<,=,<=...:字典序比較
  • +=:拼接兩個字串
  • getline(cin,ss):讀入帶空格的字串

輸入格式

對於scanf,printf:

"%02d":兩位整數(例如13,02,05)。

"%.2lf":兩位double(例如0.13,0.02,0.05)。

雜項

memset賦足夠大值用0x3f,0和-1可以直接賦。

關閉輸入輸出流以加速讀寫:

std::ios::sync_with_stdio(false);
std::cin.tie(0);
std::cout.tie(0);

常用演算法

Floyd:

for (int k = 1; k <= n; k++) {
        for (int x = 1; x <= n; x++) {
            for (int y = 1; y <= n; y++) {
                f[x][y] = min(f[x][y], f[x][k] + f[k][y]);
            }
        }
    }

並查集

void find(size_t x) { return pa[x] == x ? x : pa[x] = find(pa[x]); }

dijkstra

struct edge {
  int v, w;
};

struct node {
  int dis, u;

  bool operator>(const node& a) const { return dis > a.dis; }
};

vector<edge> e[maxn];
int dis[maxn], vis[maxn];
priority_queue<node, vector<node>, greater<node> > q;

void dijkstra(int n, int s) {
  memset(dis, 63, sizeof(dis));
  dis[s] = 0;
  q.push({0, s});
  while (!q.empty()) {
    int u = q.top().u;
    q.pop();
    if (vis[u]) continue;
    vis[u] = 1;
    for (auto ed : e[u]) {
      int v = ed.v, w = ed.w;
      if (dis[v] > dis[u] + w) {
        dis[v] = dis[u] + w;
        q.push({dis[v], v});
      }
    }
  }
}