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;
    }
}
posted @ 2023-01-15 09:22  Furthe77oad  阅读(30)  评论(0编辑  收藏  举报