ARC #153
ARC #153
前言:
也不知道是哪个 蒟蒻 (显然这里指我) 这场只写了 T1,还自作聪明地想了 \(O(1)\) 做法,导致 \(20min\) \(Rank.2000\)
概要:
由于本弱赛时只写了 T1,看了 T2、3,所以这里只总结 T1、2 做法
A - AABCDDEFE
显然sbt
法一:
考虑从合法的第一个数字枚举,每次判断是否满足题干条件,到第 \(n\) 个直接输出当前解
也许是 : \(O(n)\) ?
法二:
通过观察,我们很容易发现:相同数字可以并成一个数字 。
即:998244353 \(\Longrightarrow\) 982435
这里 \(S_7=S_9\) ,完全可以看成都放在 \(S_7\) 上的数字,理由很简单,这里不予证明 (\(Hint\):考虑 998244353 的下一个合法数字是?动 \(S_8\) \(or\) \(S_7\) \(or\) \(S_9\))
暂称上述优化为 缩位 自己瞎取的
缩位后,数字从 \(9\) 位变成 \(8\) 位
简单推出第一个数字 110000000 缩位后为:100000
显然,当 \(n=1\) 时 缩位后的数字是 \(100000\)
\(n=2\) 时,为 \(100001\)
归纳总结:\(A=100000+n-1\)
分别求出这 \(6\) 位数字,输出
#include <bits/stdc++.h>
using namespace std;
int n;
signed main() {
ios::sync_with_stdio(false);
cin.tie(0);
cin >> n;
int a = 100000 + n - 1;
int s1, s2, s3, s4, s5, s6;
s6 = a% 10;
s5 = (a% 100)/ 10;
s4 = (a% 1000)/ 100;
s3 = (a% 10000)/ 1000;
s2 = (a% 100000)/ 10000;
s1 = a/ 100000;
cout << s1 << s1 << s2 << s3 << s4 << s4 << s5 << s6 << s5;
return 0;
}
时间复杂度:\(O(1)\)
可是我…… 放着法一不想写,想写法二花了 \(10min\)
B - Grid Rotations
显然我不会这题,赛时想了单次询问 \(O(n^2)\)
然后……就不会了
赛后问 \(yql\) \(dalao\) 才知道时平衡树板
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
int h, w;
cin >> h >> w;
vector <vector <char>> mat(h, vector <char> (w));
for (int i = 0; i < h; i++) {
for (int j = 0; j < w; j++) {
cin >> mat[i][j];
}
}
int q;
cin >> q;
vector <vector <int>> ab(q, vector <int> (2));
for (int i = 0; i < q; i++) {cin >> ab[i][0] >> ab[i][1];}
int row = 0, col = 0;
int cnt = 0;
for (auto& rot : ab) {
int a = rot[0], b = rot[1];
if (cnt % 2 == 0) {
row = (row + a) % h;
col = (col + b) % w;
} else {
row = (row + h - a) % h;
col = (col + w - b) % w;
}
cnt++;
}
for (int i = 0; i < h; i++) {
for (int j = 0; j < w; j++) {
int r, c;
if (q % 2 == 0) {
r = (row + i) % h;
c = (col + j) % w;
} else {
r = (row + 2 * h - i - 1) % h;
c = (col + 2 * w - j - 1) % w;
}
cout << mat[r][c];
}
cout << endl;
}
}