奇怪的小技巧(毒瘤寫法)#
這裡記錄一些我覺得很酷、第一次看到的時候讓我打開眼界的寫法
比較主觀#
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 為之前最優加上此路徑為目前最優就替換
每個演算法都有他想要這樣做的原因,要找出來理解他就不容易忘記
