A. Domino Disaster

2分钟签到

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <bits/stdc++.h>
#define fors(i, a, b) for(int i = (a); i <= (b); ++i)
#define lson k<<1
#define rson k<<1|1
#define pb push_back
#define lowbit(x) ((x)&(-(x)))
#define mem(a) memset(a, 0, sizeof(a))
#define DDLC_ESCAPE_PLAN_FAILED ios::sync_with_stdio(false), cin.tie(0)
#define int long long
const int inf = 0x3f3f3f3f;
const double dinf = 1e100;
typedef long long ll;
//const ll linf = 9223372036854775807LL;
// const ll linf = 1e18;
using namespace std;

signed main()
{
DDLC_ESCAPE_PLAN_FAILED;
int t;
cin >> t;
while(t--)
{
int n;
cin >> n;
string s;
cin >> s;
for(auto x : s){
if(x == 'U') cout << 'D';
else if(x == 'D') cout << 'U';
else cout << x;
}
cout << endl;
}
return 0;
}

B. MEXor Mixup

题意

现在有一个未定数组,它的$Mex$是$a$, 它所有元素的异或和是$b$​,问这个数组最少有几个元素。$(0<a\leq 3e5,0\leq b\leq 5e4)$.​

分析

由于$Mex=a$,故$[0,a-1]$​必定出现。

讨论特殊情况:当$a=1,b=0$,这个数组是$\{0\}$,共一个元素。

其余的情况,首先我们对$[0,a-1 ]$做异或和,得出来一个数$x$。此时我们可以再取一个数$y$,使得$x\bigoplus y = b$. 但是要注意,这个$y$可能就是$a$. 根据异或的性质——$x\bigoplus y = z \Harr x \bigoplus z = y$.

故我们可以求出$y=x\bigoplus b$. 如果求出来的 $y$ 和 $a$ 不相等,那么我们的数组就是$[0,a-1]$加上 $y$,共 $a + 1$ 个元素;如果$y==a$,那么我们不可以直接给数组加上$a$,但一定可以通过另外两个不等于$a$的数作异或得到$a$,故数组共$a+2$个元素。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <bits/stdc++.h>
#define fors(i, a, b) for(int i = (a); i <= (b); ++i)
#define lson k<<1
#define rson k<<1|1
#define pb push_back
#define lowbit(x) ((x)&(-(x)))
#define mem(a) memset(a, 0, sizeof(a))
#define DDLC_ESCAPE_PLAN_FAILED ios::sync_with_stdio(false), cin.tie(0)
#define int long long
const int inf = 0x3f3f3f3f;
const double dinf = 1e100;
typedef long long ll;
//const ll linf = 9223372036854775807LL;
// const ll linf = 1e18;
using namespace std;
const int maxn = 3e5 + 10;
int pre[maxn];
signed main()
{
DDLC_ESCAPE_PLAN_FAILED;
int t;
cin >> t;
pre[0] = 0;
fors(i, 1, maxn - 1) pre[i] = (pre[i - 1] ^ i);
while(t--)
{
int a, b;
cin >> a >> b;
if(a == 1 && b == 0){
cout << 1 << endl;
}
else{
int sum = pre[a - 1];
if(sum == b) cout << a << endl;
else if((sum ^ a) == b) cout << a + 2 << endl;
else cout << a + 1 << endl;
}
}
return 0;
}

C. Carring Condrum

题意

作有着错误进位方式的竖式运算,每次遇到进位都会进两位而不是进一位。例如$1+9$,进位得到的1会放在百位而不是十位。

现在给出一个数$n$,问有多少对有序数对$(a,b)$,$0<a,b<n$,在经过这种错误运算方式之后会得到$n$.

分析

因为每次都进两位,故奇数位和偶数位之间互相不影响,可以把它们分开来看。

例如,2021这个数,我们可以拆成22和1.

其中,加和得到22的有序数对共23对($a$从$0$到$22$​),加和得到1的有序数对共2对。把这奇偶的方法合并,那么总共有$23×2=46$个数对。

但是,由于2021这个数不能拆成$(0,2021)$和$(2021,0)$,所以要减去2个,最终答案是44.

所以,若拆分后奇数位数字是$x$,偶数位的是$y$,答案显然是$(x+1)(y+1)-2$.

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <bits/stdc++.h>
#define fors(i, a, b) for(int i = (a); i <= (b); ++i)
#define lson k<<1
#define rson k<<1|1
#define pb push_back
#define lowbit(x) ((x)&(-(x)))
#define mem(a) memset(a, 0, sizeof(a))
#define DDLC_ESCAPE_PLAN_FAILED ios::sync_with_stdio(false), cin.tie(0)
#define int long long
const int inf = 0x3f3f3f3f;
const double dinf = 1e100;
typedef long long ll;
//const ll linf = 9223372036854775807LL;
// const ll linf = 1e18;
using namespace std;
const int maxn = 3e5 + 10;
int pre[maxn];
signed main()
{
DDLC_ESCAPE_PLAN_FAILED;
int t;
cin >> t;
while(t--)
{
string s;
cin >> s;
int a = 0, b = 0;
for(int i = 0; i < s.size(); ++i){
if(i & 1) a = a * 10 + s[i] - '0';
else b = b * 10 + s[i] - '0';
}
a++, b++;
cout << a * b - 2 << endl;
}
return 0;
}