###### tags: `tutorial` # TIOJ ApfCon 2022 Editorial --- ![](https://i.imgur.com/yed5Zfk.gif) --- ## pA Setter: `8e7` 首殺: apf22_011 (2022-03-31 17:15:34) ---- 就是Wordle啦 ---- 上傳一個五個小寫英文字母的合法單字,用verdict看結果。 WA: 非法輸入 AC: 綠色 RE: 黃色 TLE: 灰色 ---- 原本的字是dzisk 但是被暴雷了qwq 所以改成了很難猜的jujus ---- 解法1: 反正一直推到所有可能的字母就好 解法2: 用pB的單字庫幫你找 --- ## pB 學習歷程 Setter: `8e7` 首殺: apf22_005 (2022-03-31 23:55:21) ---- 資料壓縮題??? 這場比賽唯一一個演算法題 ---- Subtask 1: 全部壓成一行輸出。 ---- Subtask 2: 想辦法轉成64或85進位之類的? 另解:紀錄所有出現的前兩個/後三個字母組合? ---- Subtask 3: Trie/Hash 想辦法紀錄資料的長相(前序遍歷?) Sparse/Dense Trie? 官解用Trie ---- Dense Trie 的寫法:(naive的,10分) by apf22_002: ```cpp= #include <bits/stdc++.h> using namespace std; string ans = "aahed***lii***rgh**ti****baca*i*k*s**ft**ka**mp**nd**se*h*k**te**ya***bas**ed*s*y..."; int main () { string t; for (char c : ans) { if (c == '*') { t.pop_back(); } else { t += c; if (t.length() == 5) cout << t << '\n'; } } } ``` ---- Subtask 4: 優化一下Trie (分層紀錄小孩) 看 Hash 值的差分?! ---- by apf22_005: ```cpp= #include <bits/stdc++.h> using namespace std; string s="AahedLiiRghTiBacaIKSFtKaMpNdSeHKTeYaBasEdSYOtCeeEamRLeRsTsHorIdeEsLedRSTOw"; int main(){ vector<string> v; for(auto &i:s){ if(i<='Z'){ v.emplace_back(); i+='a'-'A'; } v.back().push_back(i); } string last; for(auto &i:v){ int k=i.size(); if(k<5){ i=last.substr(0,5-k)+i; } cout<<i<<"\n"<<flush; last=i; } } ``` ---- Subtask 5: 將單字重新排序 (Trie最佳順序是第 5,3,4,2,1個字母) 壓換行/Tab/空格? 官解用base 64還有胖胖的code寫。 ---- by apf22_005: 教嗎 ```cpp= #include <bits/stdc++.h> #define F(i,a,b) for(t i=a;i<=b;i++) #define sz(x) ((t)x.size()) #define eb emplace_back #define V vector #define S string #define t int using namespace std; S I=" ; B ? > , C C 2 A B 4 C ! ; = ; ) + 3 & N + ; - J . > 3 ? ( + 4 ? 9 ; c M % q 9 / N # ..."; #define o(c) (c-(c>92)-(c>34)-32) t main(){ V<t> a; for(t i=0;i<sz(I);i+=2){ a.eb(o(I[i])*93+o(I[i+1])); } V<S> r; F(i,0,25) r.eb(S()+char(i+'A')); F(i,0,25) r.eb(S()+char(i+'a')); S n=r[a[0]]; t p=a[0]; F(i,1,sz(a)-1){ t c=a[i]; if(c<sz(r)){ n+=r[c]; r.eb(r[p]+r[c][0]); }else{ r.eb(r[p]+r[p][0]); n+=r.back(); } p=c; } V<S> u; for(auto &c:n){ if(c<='Z') u.eb(),c+=32; u.back().push_back(c); } S w;for(auto &s:u){w=w.substr(0,5-sz(s))+s;cout<<w<<"\n";}return 0; } ``` --- ## pC 我長大以後要當壓常數超人 Setter: `FHVirus` 首殺:`LCT (2022-04-01 00:35:38)` ---- 對我就是要噁人 然後順便譴責這種噁心 Code Style ```cpp= #include<bits/stdc++.h> using namespace std; #define F first #define S second #define pb push_back #define int long long int t,n,k,m,x,y,vis1[200005],vis2[200005],ans,a[200005],b[200005],cnt,q,mod=998244353,cnt1,cnt2; int ax,ay,cx,cy; string s; bool d=0; signed main() { ... } ``` ---- 首先你要先猜到是什麼常數 根據題目給的 Code Style 應該不難猜出是字元集大小 然後字元集 77 和 49 是真的剛剛好,不是硬湊得 ---- ### 7 分 (49) 把沒用到的變數刪掉就好。 ```cpp= #include<iostream> using namespace std; int main() { int long_tree; cin >> long_tree; int T; cin >> T; while (T --> 0) { int N; cin >> N; int A[N]; int x = (1 << 16) - 1, y = 0, z = 0; for (int i = 0; i < N; ++i) { cin >> A[i]; x &= A[i]; y |= A[i]; z ^= A[i]; } cout << x << ' ' << y << ' ' << z << endl; for (int i = 0; i < N; ++i) { cout << A[i] % A[0] << ' '; } cout << endl; } return 0; } ``` ---- ### 14 分 (42) 再換一下變數名稱,改成換不掉的字母。 換成 `f` 的動機等等會提到。 ---- ### 14 分 (42) ```cpp= #include<iostream> using namespace std; int main() { int t; cin >> t; cin >> t; while (t --> 0) { int n; cin >> n; int a[n]; int f = (1 << 16) - 1, c = 0, d = 0; for (int i = 0; i < n; ++i) { cin >> a[i]; f &= a[i]; c |= a[i]; d ^= a[i]; } cout << f << ' ' << c << ' ' << d << endl; for (int i = 0; i < n; ++i) { cout << a[i] % a[0] << ' '; } cout << endl; } return 0; } ``` ---- 接下來會按照出題者想到的順序介紹,但其實這些技巧可以按照任意順序使用。大概吧。 ---- ### 21 分 (38) 考慮只有用到一兩次的字元: - `using namespace std;` 裡面的 `g` 和 `p`,少 `1`(因為會多冒號)。 - `while` 裡面的 `w` 和 `h` 可以換成 `for`,少 `2`。 - 把 `(1 << 16) - 1` 換成 `0xffff` 可以少 `2`。這也是為什麼上一步把變數改成 `f`。至於 `x` 會去哪裡等等才會知道。 - 把所有的空白改成換行,縮排拿掉也可以少 `2`,但直到最後一個 subtask 前都可以不用。 ---- ### 21 分 (38) ```cpp= #include<iostream> int main() { int t; std::cin >> t; std::cin >> t; for (; t; --t) { int n; std::cin >> n; int a[n], f = 0xffff, c = 0, d = 0; for (int i = 0; i < n; ++i) { std::cin >> a[i]; f &= a[i]; c |= a[i]; d ^= a[i]; } std::cout << f << ' ' << c << ' ' << d << std::endl; for (int i = 0; i < n; ++i) { std::cout << a[i] % a[0] << ' '; } std::cout << std::endl; } return 0; } ``` ---- ### 28 分 (36) - 把逗號拿掉,少 `1`。 - 把加號拿掉,讓 `n - 1` 裡的 `1` 用變數名稱的字母的 16 進位表示。少 `1`。 ---- ### 28 分 (36) ```cpp= #include<iostream> int main() { int t; std::cin >> t; std::cin >> t; for (; t; --t) { int n; std::cin >> n; int a[n]; int f = 0xffff; int c = 0; int d = 0; for (int i = n - (0xd - 0xc); i > (0xc - 0xd); --i) { std::cin >> a[i]; f &= a[i]; c |= a[i]; d ^= a[i]; } std::cout << f << ' ' << c << ' ' << d << std::endl; for (int i = n - (0xd - 0xc); i > (0xc - 0xd); --i) { std::cout << a[i] % a[n - (0xd - 0xc)] << ' '; } std::cout << std::endl; } return 0; } ``` ---- ### 35 分 (34) - 用 `char()` 換掉單引號和 `std::endl` 裡面的 `l`。空白和換行的 `ascii` 剛好都不需要 `0abcdef` 以外的數字。 ---- ### 35 分 (34) ```cpp= #include<iostream> int main() { int t; std::cin >> t; std::cin >> t; for (; t; --t) { int n; std::cin >> n; int a[n]; int f = 0xffff; int c = 0; int d = 0; for (int i = n - (0xd - 0xc); i > (0xc - 0xd); --i) { std::cin >> a[i]; f &= a[i]; c |= a[i]; d ^= a[i]; } std::cout << f << char(0xc0 - 0xa0) << c << char(0xc0 - 0xa0) << d << char(0xa); for (int i = n - (0xd - 0xc); i > (0xc - 0xd); --i) { std::cout << a[i] % a[n - (0xd - 0xc)] << char(0xc0 - 0xa0); } std::cout << char(0xa); } return 0; } ``` ---- #### 49 分 (32) 這裡需要一點進階語法。 - 你可以用 `int constructor` 把 `=` 拿掉。少 `1`。 - `C++` 的部份運算子有 `alternative operator`,可以在 [C++ reference](https://tioj.ck.tp.edu.tw/cppref-17/en/cpp/language/operator_alternative.html) 查到。如果你有在 `monkeytype` 裡面選過 `C/C++` 語言的選項應該會看過。這樣少 `3`。 ---- #### 49 分 (32) ```cpp= #include<iostream> int main() { int t; std::cin >> t; std::cin >> t; for (; t; --t) { int n; std::cin >> n; int a[n]; int f(0xffff); int c(0); int d(0); for (int i(n - (0xd - 0xc)); i > (0xc - 0xd); --i) { std::cin >> a[i]; f and_eq a[i]; c or_eq a[i]; d xor_eq a[i]; } std::cout << f << char(0xc0 - 0xa0) << c << char(0xc0 - 0xa0) << d << char(0xa); for (int i(n - (0xd - 0xc)); i > (0xc - 0xd); --i) { std::cout << a[i] % a[n - (0xd - 0xc)] << char(0xc0 - 0xa0); } std::cout << char(0xa); } return 0; } ``` ---- ### 98 分 (29) 你曾經夢想過沒有大括號的 `C++` 嗎? 這是辦得到的! ---- 上個 subtask 提到的 `alternative operator` 也可以用在井字號、大括號、中括號上,可以壓掉 `3`。 ```cpp= # = %: {} = <%%> [] = <::> ``` 是不是很噁心啊? ---- ### 98 分 (29) ```cpp= %:include<iostream> int main() <% int t; std::cin >> t; std::cin >> t; for (; t; --t) <% int n; std::cin >> n; int a<:n:>; int f(0xffff); int c(0); int d(0); for (int i(n - (0xd - 0xc)); i > (0xc - 0xd); --i) <% std::cin >> a<:i:>; f and_eq a<:i:>; c or_eq a<:i:>; d xor_eq a<:i:>; %> std::cout << f << char(0xc0 - 0xa0) << c << char(0xc0 - 0xa0) << d << char(0xa); for (int i(n - (0xd - 0xc)); i > (0xc - 0xd); --i) <% std::cout << a<:i:> % a<:n - (0xd - 0xc):> << char(0xc0 - 0xa0); %> std::cout << char(0xa); %> return 0; %> ``` ---- ### 滿分 (27) 就再壓掉空白縮排。 恭喜你 `C++` 的語法又更上一層了~ ---- ### 另解一 by `notionlee` ```cpp= #include<iostream> int eeea; int ea=(eeea==eeea); int lin=(ea==(ea+ea)); #define eded(e) (((e>>ea)<<ea)==e) #define odod(e) (not eded(e)) #define andd() {o=lin;for(int i=lin;i<((((ea << ea)<<ea)<<ea)<<ea);i++){if((odod(oea>>i)) and (odod(ooea>>i))) o+=(ea<<i);}} #define orr() {oo=lin;for(int i=lin;i<((((ea << ea)<<ea)<<ea)<<ea);i++){if((odod(oea>>i)) or (odod(ooea>>i))) oo+=(ea<<i);}} #define minu(e) (nott(e)+ea) int nott(int e){ int res=lin; for(int i=lin;i<(((((ea << ea)<<ea)<<ea)<<ea)<<ea);i++){ if(not (odod(e>>i))) res+=ea<<i; } return res; } int o; int oo; int oea; int ooea; int a; int aa; int aaa; int aaaa; int aaaaa; int aaaaaa; int* aaaaaaa=(int*)malloc((ea<<((((ea << ea)<<ea)<<ea)<<ea))); int aaaaaaaa; int main() { std::cin >> aaaaaaaa; std::cin >> aaaa; aaaa++; for(;aaaa+=minu(ea);){ std::cin >> aaaaaa; aaaaa = (ea<<((((ea << ea)<<ea)<<ea)<<ea)) +minu(ea); aaa = lin; aa = lin; for (a = lin; a < aaaaaa; ++a) { std::cin >> (*(aaaaaaa+a)); oea=aaaaa; ooea=(*(aaaaaaa+a)); orr(); aaaaa = aaaaa + (*(aaaaaaa+a)) +minu(oo); oea=aaa; ooea=(*(aaaaaaa+a)); orr(); aaa = oo; oea=aa; ooea=(*(aaaaaaa+a)); andd(); orr(); aa = oo +minu(o); } std::cout << aaaaa << std::endl << aaa << std::endl << aa << std::endl; for (a = lin; a < aaaaaa; ++a) { int res=(*(aaaaaaa+a)); if((*aaaaaaa)==ea){ res=lin; }else if((*aaaaaaa)==ea+ea){ res=odod(res); }else{ for(;res>=(*(aaaaaaa));){ res+=minu((*(aaaaaaa))); } } std::cout << res << std::endl; } std::cout << std::endl; } } ``` ---- ### 另解二 by `LCT` ```cpp= %:include <iostream> const int i = 't' - 's'; const int ii = i - -i; const int iii = ii - -ii; const int iiii = iii - -iii; const int iiiii = iiii - -iiii; const int iiiiii = iiiii - -iiiii; const int iiiiiii = iiiiii - -iiiiii; const int iiiiiiii = iiiiiii - -iiiiiii; const int iiiiiiiii = iiiiiiii - -iiiiiiii; const int iiiiiiiiii = iiiiiiiii - -iiiiiiiii; const int iiiiiiiiiii = iiiiiiiiii - -iiiiiiiiii; const int iiiiiiiiiiii = iiiiiiiiiii - -iiiiiiiiiii; const int iiiiiiiiiiiii = iiiiiiiiiiii - -iiiiiiiiiiii; const int iiiiiiiiiiiiii = iiiiiiiiiiiii - -iiiiiiiiiiiii; const int iiiiiiiiiiiiiii = iiiiiiiiiiiiii - -iiiiiiiiiiiiii; const int iiiiiiiiiiiiiiii = iiiiiiiiiiiiiii - -iiiiiiiiiiiiiii; const int iiiiiiiiiiiiiiiii = iiiiiiiiiiiiiiii - -iiiiiiiiiiiiiiii; int n<:iiiiiiiiiiiiiii:>; int nn; int nnn; int nnnn; int nnnnn; int nnnnnn; int nnnnnnn; int rr(int tt) <% std::cin >> n<:tt:>; nnn &= n<:tt:>; nnnnn ??'= n<:tt:>; nnnn = (nnnn & n<:tt:>) - -(nnnn ??' n<:tt:>); return (tt < nnnnnn - i ? rr(tt - -i) : i); %> int rrr(int tt) <% std::cout << n<:tt:> % n<:i - i:> << ' '; return (tt < nnnnnn - i ? rrr(tt - -i) : i); %> int r(int t) <% std::cin >> nnnnnn; nnn = iiiiiiiiiiiiiiiii - i; nnnn = i - i; nnnnn = i - i; rr(i - i); std::cout << nnn << ' ' << nnnn << ' ' << nnnnn << std::endl; rrr(i - i); std::cout << std::endl; return (t > i? r(t-i) : i); %> int main() <% std::cin >> nn >> nn; r(nn); %> ``` ---- ### 另解三 by `SorahISA` ```cpp= int i, it, n, s, t, o, oo, tc, ans, tans; int main() { o = scanf("%d", &s); oo = -(-o-o-o-o-o-o-o-o-o-o); scanf("%d", &t); for (tc = o-o; tc < t; tc-=-o) { scanf("%d", &n); int a[n]; for (i = o-o; i < n; i-=-o) scanf("%d", a-(-i)); ans = a[o-o]; for (i = o; i < n; i-=-o) ans &= a[i]; printf("%d ", ans); ans = o-o; for (it = o; it < o<<(o<<(o<<(o<<o))); it <<= o) { tans = o-o; for (i = o-o; i < n; i-=-o) if (a[i] & it) tans = it; ans -= -tans; } printf("%d ", ans); ans = o-o; for (it = o; it < o<<(o<<(o<<(o<<o))); it <<= o) { tans = o-o; for (i = o-o; i < n; i-=-o) tans -= a[i] & it; tans = -tans & it; ans -= -tans; } printf("%d%c", ans, oo); for (i = o-o; i < n; i-=-o) printf("%d ", a[i] % a[o-o]); printf("%c", oo); } } ``` ---- ```cpp= int getchar(); int putchar(int c); int ntn; int nea; int tp; int o; int oo; int oea; int ooea; int a; int aa; int aaa; int aaaa; int aaaaa; int aaaaaa; int aaaaaaa??((1 << ((((1 << 1) << 1) << 1) << 1))??); int aaaaaaaa; int f; int rec; int re; int i; int in; int inc; int otn; int oti; int ott; int ot??((((1 << ((((1 << 1) << 1) << 1) << 1)) << 1) << 1)??); int ncrin; int fot(int ootn) ??< otn = ootn; oti = (1 == (1 + 1)); if (otn == (1 == (1 + 1))) ??< ot??(oti??) = ((1 << ((1 << 1) << 1)) + (1 << (((1 << 1) << 1)) + 1)); oti++; ??> for (; otn > (1 == (1 + 1)); oti++) ??< ott = (1 == (1 + 1)); for (; otn >= (1 << ((1 << 1) + 1)) + (1 << 1);) ??< ott++; otn += ntn; ??> ot??(oti??) = otn + ((1 << ((1 << 1) << 1)) + (1 << (((1 << 1) << 1)) + 1)); otn = ott; ??> for (; oti > (1 == (1 + 1));) ??< oti += nea; putchar(ot??(oti??)); ??> ??> int main() ??< ??< re = (1 == (1 + 1)); for (i = (1 == (1 + 1)); i < (((((1 << 1) << 1) << 1) << 1) << 1); i++) ??< if ((1 == (1 + 1)) == (((1 == (1 + 1)) == (((((((1 << ((1 << 1) << 1)) + (1 << (((1 << 1) << 1)) + 1)) >> i)>>1)<<1)==(((1 << ((1 << 1) << 1)) + (1 << (((1 << 1) << 1)) + 1)) >> i)))))) re += 1 << i; ??> re += 1; ??>; ncrin = re; ??< re = (1 == (1 + 1)); for (i = (1 == (1 + 1)); i < (((((1 << 1) << 1) << 1) << 1) << 1); i++) ??< if ((1 == (1 + 1)) == (((1 == (1 + 1)) == ((((((1 << ((1 << 1) + 1)) + (1 << 1) >> i)>>1)<<1)==((1 << ((1 << 1) + 1)) + (1 << 1) >> i)))))) re += 1 << i; ??> re += 1; ??>; ntn = re; ??< re = (1 == (1 + 1)); for (i = (1 == (1 + 1)); i < (((((1 << 1) << 1) << 1) << 1) << 1); i++) ??< if ((1 == (1 + 1)) == (((1 == (1 + 1)) == (((((1 >> i)>>1)<<1)==(1 >> i)))))) re += 1 << i; ??> re += 1; ??>; nea = re; ??< in = (1 == (1 + 1)); for (; ((((inc = getchar()) <= ((1 << ((1 << 1) << 1)) + (1 << (((1 << 1) << 1)) + 1) + 1 + (1 << ((1 << 1) + 1)))) == (1 == (1 + 1))) == (1 == (1 + 1))) + (inc >= ((1 << ((1 << 1) << 1)) + (1 << (((1 << 1) << 1)) + 1))) >= 1 + 1;) ??< in = (in << ((1 << 1) + 1)) + (in << 1) + inc + ncrin; ??> ??>; aaaaaaaa = in; ??< in = (1 == (1 + 1)); for (; ((((inc = getchar()) <= ((1 << ((1 << 1) << 1)) + (1 << (((1 << 1) << 1)) + 1) + 1 + (1 << ((1 << 1) + 1)))) == (1 == (1 + 1))) == (1 == (1 + 1))) + (inc >= ((1 << ((1 << 1) << 1)) + (1 << (((1 << 1) << 1)) + 1))) >= 1 + 1;) ??< in = (in << ((1 << 1) + 1)) + (in << 1) + inc + ncrin; ??> ??>; aaaa = in; for (; aaaa;) ??< aaaa += nea; ??< in = (1 == (1 + 1)); for (; ((((inc = getchar()) <= ((1 << ((1 << 1) << 1)) + (1 << (((1 << 1) << 1)) + 1) + 1 + (1 << ((1 << 1) + 1)))) == (1 == (1 + 1))) == (1 == (1 + 1))) + (inc >= ((1 << ((1 << 1) << 1)) + (1 << (((1 << 1) << 1)) + 1))) >= 1 + 1;) ??< in = (in << ((1 << 1) + 1)) + (in << 1) + inc + ncrin; ??> ??>; aaaaaa = in; aaaaa = (1 << ((((1 << 1) << 1) << 1) << 1)) + nea; aaa = (1 == (1 + 1)); aa = (1 == (1 + 1)); for (a = (1 == (1 + 1)); a < aaaaaa; ++a) ??< ??< in = (1 == (1 + 1)); for (; ((((inc = getchar()) <= ((1 << ((1 << 1) << 1)) + (1 << (((1 << 1) << 1)) + 1) + 1 + (1 << ((1 << 1) + 1)))) == (1 == (1 + 1))) == (1 == (1 + 1))) + (inc >= ((1 << ((1 << 1) << 1)) + (1 << (((1 << 1) << 1)) + 1))) >= 1 + 1;) ??< in = (in << ((1 << 1) + 1)) + (in << 1) + inc + ncrin; ??> ??>; aaaaaaa??(a??) = in; oea = aaaaa; ooea = (aaaaaaa??(a??)); ??< o = (1 == (1 + 1)); for (i = (1 == (1 + 1)); i < ((((1 << 1) << 1) << 1) << 1); i++) ??< if ((((1 == (1 + 1)) == (((((oea>>i)>>1)<<1)==(oea>>i))))) + (((1 == (1 + 1)) == (((((ooea>>i)>>1)<<1)==(ooea>>i))))) >= 1 + 1) o += (1 << i); ??> ??>; aaaaa = o; oea = aaa; ooea = (aaaaaaa??(a??)); ??< oo = (1 == (1 + 1)); for (i = (1 == (1 + 1)); i < ((((1 << 1) << 1) << 1) << 1); i++) ??< if ((((1 == (1 + 1)) == (((((oea>>i)>>1)<<1)==(oea>>i))))) + (((1 == (1 + 1)) == (((((ooea>>i)>>1)<<1)==(ooea>>i))))) > (1 == (1 + 1))) oo += (1 << i); ??> ??>; aaa = oo; oea = aa; ooea = (aaaaaaa??(a??)); ??< oo = (1 == (1 + 1)); for (i = (1 == (1 + 1)); i < ((((1 << 1) << 1) << 1) << 1); i++) ??< if ((((1 == (1 + 1)) == (((((oea>>i)>>1)<<1)==(oea>>i))))) + (((1 == (1 + 1)) == (((((ooea>>i)>>1)<<1)==(ooea>>i))))) > (1 == (1 + 1))) oo += (1 << i); ??> ??>; ??< o = (1 == (1 + 1)); for (i = (1 == (1 + 1)); i < ((((1 << 1) << 1) << 1) << 1); i++) ??< if ((((1 == (1 + 1)) == (((((oea>>i)>>1)<<1)==(oea>>i))))) + (((1 == (1 + 1)) == (((((ooea>>i)>>1)<<1)==(ooea>>i))))) >= 1 + 1) o += (1 << i); ??> ??>; ??< re = (1 == (1 + 1)); for (i = (1 == (1 + 1)); i < (((((1 << 1) << 1) << 1) << 1) << 1); i++) ??< if ((1 == (1 + 1)) == (((1 == (1 + 1)) == (((((o >> i)>>1)<<1)==(o >> i)))))) re += 1 << i; ??> re += 1; ??>; aa = oo + re; ??> fot(aaaaa); putchar((1 << (((1 << 1) << 1) + 1))); fot(aaa); putchar((1 << (((1 << 1) << 1) + 1))); fot(aa); putchar(((1 << ((1 << 1) + 1)) + (1 << 1))); for (a = (1 == (1 + 1)); a < aaaaaa; ++a) ??< rec = (aaaaaaa??(a??)); f = (1 == (1 + 1)); if ((aaaaaaa??((1 == (1 + 1))??)) == 1) ??< rec = (1 == (1 + 1)); f = 1; ??> if ((f == (1 == (1 + 1))) + ((aaaaaaa??((1 == (1 + 1))??)) == 1 + 1) >= 1 + 1) ??< rec = ((1 == (1 + 1)) == (((((rec)>>1)<<1)==(rec)))); f = 1; ??> if (f == (1 == (1 + 1))) ??< ??< re = (1 == (1 + 1)); for (i = (1 == (1 + 1)); i < (((((1 << 1) << 1) << 1) << 1) << 1); i++) ??< if ((1 == (1 + 1)) == (((1 == (1 + 1)) == (((((aaaaaaa??((1 == (1 + 1))??) >> i)>>1)<<1)==(aaaaaaa??((1 == (1 + 1))??) >> i)))))) re += 1 << i; ??> re += 1; ??>; for (; rec >= ((aaaaaaa??((1 == (1 + 1))??)));) ??< rec += re; ??> ??> fot(rec); putchar((1 << (((1 << 1) << 1) + 1))); ??> putchar(((1 << ((1 << 1) + 1)) + (1 << 1))); ??> ??> ``` ---- [毒瘤](https://pastebin.com/n0QF2dtV) ---- 最佳解到了 `longtree = 23` 我也是蠻驚訝的 到底是誰在耍毒啊 XD --- ## pD monday cactus analysis Setter: `FHVirus` 首殺:`APF22_002 (2022-04-01 09:07:11)` ---- 這題的定位是水題 ---- 不需要考慮沒有標記的部份 ---- 我有標記邊嗎? ---- 哈哈其實只要判斷 $u$ 是否等於 $v$ 就好了 看到一堆人在標點超爽 我敗人品敗的有點嚴重 我二模要下去了 --- ## pE 語言學問題 Setter: `8e7` 首殺: APF22_010 (2022-03-31 18:25:09) ---- 其實就是判斷一句話有沒有在裝弱啦 1: 我弱/你強, 0:我又弱又強, -1: 我強/你弱 還有各種變形 可以在 `words.txt`找到所有使用的單字。 ---- 先把每個「又」的東西分開考慮。對於每句話數inverter (不、裝)數量,判斷受詞的基礎狀態 (弱、強、燒雞、破台、輸、贏) 記得判斷主詞是誰 ---- 這題我一直寫錯,大燒雞。 原本要寫花式裝弱的,但這個東西我也不會定義qq 「你打爆裝弱的我」 「你的弱比我的強還更強」 --- ## pF 碰撞機器人 Setter: `Wiwiho` ---- 第一名的解究竟是多少呢...? ---- ### 每個人的最佳解 ``` // handle submission steps apf22_008 298258 90 apf22_005 298182 96 apf22_010 298225 110 apf22_009 297381 113 apf22_004 297871 118 apf22_007 298209 130 joylintp 297813 133 apf22_002 298384 139 apf22_006 298344 140 bear1222 298136 154 apf22_001 297573 207 ``` ---- - $S=11$ - $B_{11..15} = \{1, 1, 1, 1, 1\}$ - $T_{11..15} = \{1, 2, 3, 4, 5\}$ - $A = \{90, 96, 110, 113, 118, \dots\}$ ---- ### apf22_008 298258 ``` 90 R L R U R R R D B U B L B D B L B D B R B U B R Y L G R R U R L R D R R R D R L B U B L G L G D G R G U B D B R B U R U B L B U B R B D B L B D B R B D B L R L Y U Y R Y D Y L Y D Y R B R B U B L B D B R B U B L B U B R G R G U G R G D G R G D G L G U R R R U G R G D G L G U Y L Y D Y R R D G R G U G L G D G R G U R L R U G L G U G L Y U Y L Y D Y L B L B D ``` ---- 為什麼你們會覺得測資 $T<10$ 只能輸出到第 $T$ 關 ---- 某公告出現的原因 ```cpp= #include <bits/stdc++.h> #pragma GCC optimize("Ofast") #define AquA cin.tie(0);ios_base::sync_with_stdio(0); #define fs first #define sc second #define cd complex<double> #define p_q priority_queue using namespace std; int main(){ AquA; int t; cin >> t; if(t==1){ cout << 17 << "\n"; cout << "R U\n\ R L\n\ R D\n\ B D\n\ B L\n\ B U\n\ B L\n\ G D\n\ G L\n\ G U\n\ G L\n\ G D\n\ G R\n\ B D\n\ B R\n\ B U\n\ B R\n"; } else if(t==2){ cout << 18 << "\n"; cout << "R U\n\ R L\n\ R D\n\ B D\n\ B L\n\ B U\n\ B L\n\ G D\n\ G L\n\ G U\n\ G L\n\ G D\n\ G R\n\ B D\n\ B R\n\ B U\n\ B R\n"; cout << "Y L\n"; } else if(t==3){ cout << 30 << "\n"; cout << "R U\n\ R L\n\ R D\n\ B D\n\ B L\n\ B U\n\ B L\n\ G D\n\ G L\n\ G U\n\ G L\n\ G D\n\ G R\n\ B D\n\ B R\n\ B U\n\ B R\n"; cout << "Y L\n"; cout << "G U\n\ G L\n\ G D\n\ G R\n\ B L\n\ B D\n\ R L\n\ R U\n\ R L\n\ R D\n\ R R\n\ R D\n"; } else if(t==4){ cout << 34 << "\n"; cout << "R U\n\ R L\n\ R D\n\ B D\n\ B L\n\ B U\n\ B L\n\ G D\n\ G L\n\ G U\n\ G L\n\ G D\n\ G R\n\ B D\n\ B R\n\ B U\n\ B R\n"; cout << "Y L\n"; cout << "G U\n\ G L\n\ G D\n\ G R\n\ B L\n\ B D\n\ R L\n\ R U\n\ R L\n\ R D\n\ R R\n\ R D\n"; cout << "R U\n\ R L\n\ G L\n\ G U\n"; } else if(t==5){ cout << 40 << "\n"; cout << "R U\n\ R L\n\ R D\n\ B D\n\ B L\n\ B U\n\ B L\n\ G D\n\ G L\n\ G U\n\ G L\n\ G D\n\ G R\n\ B D\n\ B R\n\ B U\n\ B R\n"; cout << "Y L\n"; cout << "G U\n\ G L\n\ G D\n\ G R\n\ B L\n\ B D\n\ R L\n\ R U\n\ R L\n\ R D\n\ R R\n\ R D\n"; cout << "R U\n\ R L\n\ G L\n\ G U\n"; cout << "B L\n\ B U\n\ B R\n\ G D\n\ G R\n\ G U\n"; } else if(t==6){ cout << 57 << "\n"; cout << "R U\n\ R L\n\ R D\n\ B D\n\ B L\n\ B U\n\ B L\n\ G D\n\ G L\n\ G U\n\ G L\n\ G D\n\ G R\n\ B D\n\ B R\n\ B U\n\ B R\n"; cout << "Y L\n"; cout << "G U\n\ G L\n\ G D\n\ G R\n\ B L\n\ B D\n\ R L\n\ R U\n\ R L\n\ R D\n\ R R\n\ R D\n"; cout << "R U\n\ R L\n\ G L\n\ G U\n"; cout << "B L\n\ B U\n\ B R\n\ G D\n\ G R\n\ G U\n"; cout << "Y U\n\ Y R\n\ Y D\n\ Y R\n\ G L\n\ G U\n\ G R\n\ G D\n\ G R\n\ B U\n\ B R\n\ B U\n\ B R\n\ B D\n\ B R\n\ B D\n\ B L\n"; } else if(t==7){ cout << 64 << "\n"; cout << "R U\n\ R L\n\ R D\n\ B D\n\ B L\n\ B U\n\ B L\n\ G D\n\ G L\n\ G U\n\ G L\n\ G D\n\ G R\n\ B D\n\ B R\n\ B U\n\ B R\n"; cout << "Y L\n"; cout << "G U\n\ G L\n\ G D\n\ G R\n\ B L\n\ B D\n\ R L\n\ R U\n\ R L\n\ R D\n\ R R\n\ R D\n"; cout << "R U\n\ R L\n\ G L\n\ G U\n"; cout << "B L\n\ B U\n\ B R\n\ G D\n\ G R\n\ G U\n"; cout << "Y U\n\ Y R\n\ Y D\n\ Y R\n\ G L\n\ G U\n\ G R\n\ G D\n\ G R\n\ B U\n\ B R\n\ B U\n\ B R\n\ B D\n\ B R\n\ B D\n\ B L\n"; cout << "G L\n\ G U\n\ G R\n\ Y L\n\ Y U\n\ Y R\n\ Y D\n"; } else if(t==8){ cout << 85 << "\n"; cout << "R U\n\ R L\n\ R D\n\ B D\n\ B L\n\ B U\n\ B L\n\ G D\n\ G L\n\ G U\n\ G L\n\ G D\n\ G R\n\ B D\n\ B R\n\ B U\n\ B R\n"; cout << "Y L\n"; cout << "G U\n\ G L\n\ G D\n\ G R\n\ B L\n\ B D\n\ R L\n\ R U\n\ R L\n\ R D\n\ R R\n\ R D\n"; cout << "R U\n\ R L\n\ G L\n\ G U\n"; cout << "B L\n\ B U\n\ B R\n\ G D\n\ G R\n\ G U\n"; cout << "Y U\n\ Y R\n\ Y D\n\ Y R\n\ G L\n\ G U\n\ G R\n\ G D\n\ G R\n\ B U\n\ B R\n\ B U\n\ B R\n\ B D\n\ B R\n\ B D\n\ B L\n"; cout << "G L\n\ G U\n\ G R\n\ Y L\n\ Y U\n\ Y R\n\ Y D\n"; cout << "G L\n\ Y L\n\ Y U\n\ Y R\n\ Y D\n\ B U\n\ Y L\n\ Y U\n\ R R\n\ G D\n\ G R\n\ B L\n\ B U\n\ B R\n\ B D\n\ B L\n\ B D\n\ B R\n\ R U\n\ R L\n\ R D\n"; } else if(t==9){ cout << 95 << "\n"; cout << "R U\n\ R L\n\ R D\n\ B D\n\ B L\n\ B U\n\ B L\n\ G D\n\ G L\n\ G U\n\ G L\n\ G D\n\ G R\n\ B D\n\ B R\n\ B U\n\ B R\n"; cout << "Y L\n"; cout << "G U\n\ G L\n\ G D\n\ G R\n\ B L\n\ B D\n\ R L\n\ R U\n\ R L\n\ R D\n\ R R\n\ R D\n"; cout << "R U\n\ R L\n\ G L\n\ G U\n"; cout << "B L\n\ B U\n\ B R\n\ G D\n\ G R\n\ G U\n"; cout << "Y U\n\ Y R\n\ Y D\n\ Y R\n\ G L\n\ G U\n\ G R\n\ G D\n\ G R\n\ B U\n\ B R\n\ B U\n\ B R\n\ B D\n\ B R\n\ B D\n\ B L\n"; cout << "G L\n\ G U\n\ G R\n\ Y L\n\ Y U\n\ Y R\n\ Y D\n"; cout << "G L\n\ Y L\n\ Y U\n\ Y R\n\ Y D\n\ B U\n\ Y L\n\ Y U\n\ R R\n\ G D\n\ G R\n\ B L\n\ B U\n\ B R\n\ B D\n\ B L\n\ B D\n\ B R\n\ R U\n\ R L\n\ R D\n"; cout << "Y D\n\ Y R\n\ Y U\n\ Y L\n\ G R\n\ G U\n\ G L\n\ G D\n\ G R\n\ G U\n"; } else if(t==10){ cout << 108 << "\n"; cout << "R U\n\ R L\n\ R D\n\ B D\n\ B L\n\ B U\n\ B L\n\ G D\n\ G L\n\ G U\n\ G L\n\ G D\n\ G R\n\ B D\n\ B R\n\ B U\n\ B R\n"; cout << "Y L\n"; cout << "G U\n\ G L\n\ G D\n\ G R\n\ B L\n\ B D\n\ R L\n\ R U\n\ R L\n\ R D\n\ R R\n\ R D\n"; cout << "R U\n\ R L\n\ G L\n\ G U\n"; cout << "B L\n\ B U\n\ B R\n\ G D\n\ G R\n\ G U\n"; cout << "Y U\n\ Y R\n\ Y D\n\ Y R\n\ G L\n\ G U\n\ G R\n\ G D\n\ G R\n\ B U\n\ B R\n\ B U\n\ B R\n\ B D\n\ B R\n\ B D\n\ B L\n"; cout << "G L\n\ G U\n\ G R\n\ Y L\n\ Y U\n\ Y R\n\ Y D\n"; cout << "G L\n\ Y L\n\ Y U\n\ Y R\n\ Y D\n\ B U\n\ Y L\n\ Y U\n\ R R\n\ G D\n\ G R\n\ B L\n\ B U\n\ B R\n\ B D\n\ B L\n\ B D\n\ B R\n\ R U\n\ R L\n\ R D\n"; cout << "Y D\n\ Y R\n\ Y U\n\ Y L\n\ G R\n\ G U\n\ G L\n\ G D\n\ G R\n\ G U\n"; cout << "Y U\n\ Y L\n\ G L\n\ G U\n\ G L\n\ R L\n\ R D\n\ R R\n\ R U\n\ R L\n\ R U\n\ R L\n\ R D\n"; } return 0; } ``` ---- 他發現這個問題了,但是…… ```cpp= #include <bits/stdc++.h> #pragma GCC optimize("Ofast") #define AquA cin.tie(0);ios_base::sync_with_stdio(0); #define fs first #define sc second #define cd complex<double> #define p_q priority_queue using namespace std; int main(){ AquA; int t; cin >> t; int ans[11]={0,15,16,30,34,40,63,64,75,78,96}; cout << ans[t] << "\n"; if(t>=1){ cout << "R U\n\ R L\n\ R D\n\ B U\n\ G D\n\ G L\n\ G U\n\ G L\n\ G D\n\ R L\n\ B L\n\ B D\n\ B L\n\ B U\n\ B R\n"; } if(t>=2){ cout << "Y L\n"; } if(t>=3){ cout << "R R\n\ G R\n\ G U\n\ G L\n\ G D\n\ G R\n\ B L\n\ B D\n\ R L\n\ R U\n\ R L\n\ R D\n\ R R\n\ R D\n"; } if(t>=4){ cout << "R U\n\ R L\n\ G L\n\ G U\n"; } if(t>=5){ cout << "B L\n\ B U\n\ B R\n\ G D\n\ G R\n\ G U\n"; } if(t>=6){ cout << "R R\n\ G L\n\ G U\n\ G R\n\ G D\n\ G L\n\ G D\n\ G R\n\ B U\n\ B R\n\ B U\n\ B R\n\ B D\n\ B L\n\ B D\n\ Y U\n\ Y R\n\ Y D\n\ Y L\n\ Y D\n\ B R\n\ B D\n\ B L\n"; } if(t>=7){ cout << "Y R\n"; } if(t>=8){ cout << "Y L\n\ Y D\n\ Y R\n\ R U\n\ G R\n\ G D\n\ B U\n\ G L\n\ G U\n\ R L\n\ R D\n"; } if(t>=9){ cout << "G D\n\ G R\n\ G U\n"; } if(t>=10){ cout << "G D\n\ R U\n\ R L\n\ R D\n\ R R\n\ R U\n\ R L\n\ Y U\n\ Y L\n\ Y D\n\ Y R\n\ Y U\n\ Y L\n\ G U\n\ G L\n\ G U\n\ G L\n\ G D\n"; } return 0; } ``` ---- ### 小提示 Raw string 很好用 ```cpp= cout << R"( 123 R L ... )"; ``` --- ## pG 高精度開根號 Ex. Setter: `FHVirus` 首殺:`APF22_002 (2022-03-31 16:57:52)` ---- 相對誤差 $1 ^ {0 - 9}$ ---- 那不是 $1$ 嗎? 輸出在 $(0, 2 \times ans]$ 間都可以 (甚至開賽都有一堆人問是不是 typo 了 XD) ---- #### 題外話一 我都說正實數了有人 `puts("0")` 傻眼 ---- #### 題外話二 有人只過範測也是很酷 --- ## pH 灰色火車 Setter: `8e7` 首殺: apf22_009(2022-04-01 09:23:50) ---- 好耶,解密問題 但其實沒用什麼正常的加密方式? ---- ### 如何解讀提示 題目名稱「灰色火車」和題目敘述都指向**稲葉曇『ラグトレイン』** 這首歌。 猜不到的話,把題目敘述丟進google就會找到了。 ---- 觀察`encode.txt`,發現他是一堆用逗號分隔的 "數字+字元"的東東 Run Length Encoding! 這其實根本不是密碼學,是資料壓縮的東西w ---- 解密出來會得到這樣的檔案: ![](https://i.imgur.com/tnbovHq.png) ---- Hints 說要推一推,拉一拉就會**看**到答案 把那個檔案的視窗調整一下長寬比,就會看到一個圖片。 ![](https://i.imgur.com/ZTD7DUf.png) ---- 這是一個影片! 其實就是Lagtrain 的MV。因為他是黑白的,所以適合用ascii art的方式呈現。 每一行分別是一個frame, 而我們只要想辦法播放這個影片,找到藏在裡面的數字即可。 ---- 出題方法:先下載lagtrain的mv, 再用影片剪輯軟體把數字加進去,然後用 [video-to-ascii](https://github.com/joelibaceta/video-to-ascii) 轉成ascii碼,最後把輸出dump到一個文字檔然後做 run length encoding。 --- 感謝大家的參與! 現在來票選最喜歡和最討厭的題目
{"metaMigratedAt":"2023-06-16T21:41:34.419Z","metaMigratedFrom":"Content","title":"TIOJ ApfCon 2022 Editorial","breaks":"true","contributors":"[{\"id\":\"04d32f9a-57cc-45cd-8549-086ea8ee6d8a\",\"add\":16023,\"del\":29},{\"id\":\"02353542-5acb-4a66-abd0-128b1af24abb\",\"add\":8844,\"del\":1517},{\"id\":\"a5d9c397-12f6-42f9-a15d-6726675dfedf\",\"add\":3399,\"del\":13}]"}
    525 views