快轉到主要內容

目錄

奇怪的小技巧(毒瘤寫法)
#

這裡記錄一些我覺得很酷、第一次看到的時候讓我打開眼界的寫法
比較主觀#

void 的 return
#

void f() {
    return void(cout << "oh");
}

void g() {
    return cout << "uh", void();
}

同理 多項 return
#

int f() {
    return cout << "oh", 0;
}

輸入數字,執行 n 次迴圈
#

int n;
for (cin >> n; n; n--) {}

計算總合為 m 的次數
#

cnt += sum == m

兩數互換
#

int a = 10, b = 20;
a ^= b; b ^= a; a ^= b;
cout << a << " " << b;

不用下標輸出陣列
#

int arr[] = {1, 2, 3, 4, 5};
cout << *(arr + 2);
*(arr+2) = 8;
cout << *(arr + 2);

一些感覺不紀錄會忘記的正常寫法
#

輸出中文(一個中文字佔兩格英文字的空間)
#

string s = "一二三四五六日";
int i;
cin >> i;
cout << s[2*i] << s[2*i+1];

大數除法判倍數
#

string s;
cin >> s;
for (auto c : s) {
    sum = (((c-'0') + sum) % n)*10
}

控制 range-based loop 空格換行
#

vector<int> v;
for (auto &i : v) {
	cout << i << " \n"[&i == &v.back()];
}

輸出十進位整數的二進位型態
#

int n;
bitset<32> b(n);
cout << b.to_string().substr(b.to_string().find('1'));

計算十進位整數的二進位型態有幾個 1
#

int n;
cout << __builtin_popcount(n);

依序取出字元 range based for loop
#

for (auto &k : string("ABCD1234"))

反向 range based for loop
#

vector<int> v;
for (auto &i : vector<int>(v.rbegin(), v.rend())) {

}

真的沒主題的亂筆記
#

UVA 11150 Cola solve
#

#include <bits/stdc++.h>
using namespace std;

#define WA() cin.tie(0)->sync_with_stdio(0);
#define int long long

signed main() { WA();
	int t;
	while (cin >> t) cout << t + t/2 << '\n';
}

快速冪
#

// x^y
#define int long long
int f(int x, int y) {
    int ret = 1;
    for (; y; y>>=1, x*=x) if (y&1) ret *= x;
    return ret;
}

樹壓平
#

用 DFS 紀錄每個點的時間
該節點的子樹權重和即為該進入時間~出去時間的區間和
可用 BIT 或 seg-tree 維護

演算法要知道位甚麼這樣做
#

像是 MST 為子結構最優並進行合併
與 shortest path 不同,sortest path 為之前最優加上此路徑為目前最優就替換

每個演算法都有他想要這樣做的原因,要找出來理解他就不容易忘記

Piau 的筆記本
作者
Piau 的筆記本
希望我寫下來的東西能夠長久的記在我的腦中