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

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

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';
}

快速冪

遞迴寫法:

  1. 若次方為 0 就回傳 1
  2. 若次方為奇數,先計算 $x^{y-1}$ 再乘上 x
  3. 剩下為次方為偶數的計算,為 $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 維護

avatar
Piau
一個剛剛接觸資訊領域的大一新生
正在接觸競程和資安的領域
頭像的貓咪叫做 Haru
最新文章
Treap
Segment-Tree
APCS-325
IONC-2025
網站資訊
文章數量 :
15
總字數 :
1.1w
最後更新時間 :