奇怪的小技巧(毒瘤寫法)
這裡記錄一些我覺得很酷、第一次看到的時候讓我打開眼界的寫法
比較主觀#
void 的 return
1
2
3
void f() {
return void(cout << "oh");
}多項 return
1
2
3
int f() {
return cout << "oh", 0;
}輸入數字,執行 n 次迴圈
1
for (cin >> n; n; n--) {}計算總合為 m 的次數
1
cnt += sum == m兩數互換
1
2
3
int a = 10, b = 20;
a ^= b; b ^= a; a ^= b;
cout << a << " " << b;不用下標輸出陣列
1
2
3
4
int arr[] = {1, 2, 3, 4, 5};
cout << *(arr + 2);
*(arr+2) = 8;
cout << *(arr + 2);一些感覺不紀錄會忘記的正常寫法
輸出中文(一個中文字佔兩格英文字的空間)
1
2
3
4
string s = "一二三四五六日";
int i;
cin >> i;
cout << s[2*i] << s[2*i+1];大數除法判倍數
1
2
3
4
5
string s;
cin >> s;
for (auto c : s) {
sum = (((c-'0') + sum) % n)*10
}控制 range-based loop 空格換行
1
2
3
4
vector<int> v;
for (auto &i : v) {
cout << i << " \n"[&i == &v.back()];
}輸出十進位整數的二進位型態
1
2
3
int n;
bitset<32> b(n);
cout << b.to_string().substr(b.to_string().find('1'));計算十進位整數的二進位型態有幾個 1
1
2
int n;
cout << __builtin_popcount(n);依序取出字元 range based for loop
1
for (auto k : string("ABCD1234"))反向 range based for loop
1
2
3
4
vector<int> v;
for (auto i : vector<int>(v.rbegin(), v.rend())) {
}真的沒主題的亂筆記
UVA 11150 Cola solve
1
2
3
4
5
6
7
8
9
10
#include <bits/stdc++.h>
using namespace std;
#define WA() ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL)
#define int long long
signed main() { WA();
int t;
while (cin >> t) cout << t + t/2 << '\n';
}快速冪
遞迴寫法:
- 若次方為
0就回傳 1 - 若次方為奇數,先計算 $x^{y-1}$ 再乘上 x
- 剩下為次方為偶數的計算,為 $x^{y/2} \times x^{y/2}$
1
2
3
4
5
6
7
8
#define int long long
int f(int x, int y) {
if (!y) return 1;
if (y&1) retuen f(x, y-1)*x;
int k = f(x, y/2);
return k*k;
}樹壓平
用 DFS 紀錄每個點的時間
該節點的子樹權重和即為該進入時間~出去時間的區間和
可用 BIT 或 seg-tree 維護