Codeforces Round #742 div.2 A-F题解
Posted 欣君
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #742 div.2 A-F题解相关的知识,希望对你有一定的参考价值。
视频讲解:TBD
A. Domino Disaster
题目大意
有一个 2 × n ( 1 ≤ n ≤ 100 ) 2\\times n~(1 \\leq n \\leq 100) 2×n (1≤n≤100) 的方格图,用 1 × 2 1\\times 2 1×2 的多米诺骨牌填满,每个骨牌是垂直或者水平放置的,且每个格子最多被一个骨牌覆盖。
现在给定其中一行的网格,求另一行是什么样子。
题解
‘L’ 和 ‘R’ 不变, ‘D’ 和 ‘U’ 互换。
参考代码
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
int main()
int T,n,i;
string s;
cin>>T;
while(T--)
cin>>n;
cin>>s;
for(i=0;i<n;i++)
if(s[i]=='U')
s[i]='D';
else if(s[i]=='D')
s[i]='U';
cout<<s<<endl;
B. MEXor Mixup
题目大意
给定两个整数 a , b ( a > 0 , b ≥ 0 ) a,b~(a>0,b \\geq 0) a,b (a>0,b≥0) ,求最小的非负整数数组大小,使得数组的 M E X MEX MEX 值为 a a a , X O R XOR XOR 值为 b b b 。
题解
设 0 0 0 到 i i i 的异或和为 p r e i pre_i prei 。有以下几种情况:
- 若 p r e a − 1 = b pre_a-1=b prea−1=b ,则数组为 0 0 0 到 a − 1 a-1 a−1 即可,答案为 a a a ;
- 若 p r e a − 1 ≠ b , p r e a − 1 ⊕ a = b pre_a-1\\neq b,pre_a-1\\oplus a=b prea−1=b,prea−1⊕a=b ,则数组为 0 0 0 到 a − 1 a-1 a−1 ,在加任意两个大于 a a a 的元素 x , y x,y x,y,满足 x ⊕ y = a ⊕ b x\\oplus y=a\\oplus b x⊕y=a⊕b 即可,答案为 a + 2 a+2 a+2 ;
- 若 p r e a − 1 ≠ b , p r e a − 1 ⊕ a ≠ b pre_a-1\\neq b,pre_a-1\\oplus a \\neq b prea−1=b,prea−1⊕a=b ,则数组为 0 0 0 到 a − 1 a-1 a−1 ,在加一个元素 a ⊕ b a\\oplus b a⊕b 即可,答案为 a + 1 a+1 a+1 ;
参考代码
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
const int MAXN=300300;
int pre[MAXN];
int main()
int T,a,b,i,c,ans;
for(i=1;i<MAXN;i++)
pre[i]=pre[i-1]^i;
scanf("%d",&T);
while(T--)
scanf("%d%d",&a,&b);
c=pre[a-1]^b;
if(c==0)
ans=a;
else if(c==a)
ans=a+2;
else
ans=a+1;
printf("%d\\n",ans);
C. Carrying Conundrum
题目大意
有人计算十进制加法时,进位错了。原本若当前位大于 10 10 10 则进位到左边的第一位,结果算错成进位到左边的第二位。
给定 n ( 1 ≤ n ≤ 1 0 9 ) n~(1 \\leq n \\leq 10^9) n (1≤n≤109) ,求有多少对正整数对 ( a , b ) (a,b) (a,b) 满足其在错误进位的加法下,之和为 n n n 。
题解
会发现奇数数位和偶数数位的运算相互独立,因此直接拆分单独求结果即可。
设奇数数位提取后为
a
a
a ,偶数数位提取后为
b
b
b ,则非负整数对的答案为
(
a
+
1
)
⋅
(
b
+
1
)
(a+1)\\cdot(b+1)
(a+1)⋅(b+1) ,再减去存在
0
0
0 的项,因此答案为
(
a
+
1
)
(
b
+
1
)
−
2
(a+1)(b+1)-2
(a+1)(b+1)−2 。
参考代码
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
int main()
ll T,n,a,b,i,j,ans;
scanf("%lld",&T);
while(T--)
scanf("%lld",&n);
a=b=0;
for(i=1,j=1;i<=n;i*=100,j*=10)
a+=n/i%10*j;
for(i=10,j=1;i<=n;i*=100,j*=10)
b+=n/i%10*j;
ans=(a+1)*(b+1)-2;
printf("%lld\\n",ans);
D. Expression Evaluation Error
题目大意
有 n ( 1 ≤ n ≤ min ( 100 , s ) ) n(1 \\leq n \\leq \\min(100,s)) n(1≤n≤min(100,s)) 个十进制正整数,其和在十进制下为 s ( 1 ≤ s ≤ 1 0 9 ) s(1 \\leq s \\leq 10^9) s(1≤s≤109) 。有人将这 n n n 个数看成11进制的数了,求这 n n n 个数为多少时,其按11进制求和会得到最大的结果。
题解
若在十进制下存在 1 0 k 10^k 10k ,则其在十一进制下的值为 1 1 k 11^k 11k 。若将其分配到 10 10 10 个数上,则之和为 10 × 1 1 k − 1 10\\times 11^k-1 10×11k−1 ,显然变小了。
因此得到贪心策略:若 n = a 1 a 2 . . . a k ‾ n=\\overlinea_1a_2...a_k n=a1a2...ak ,则将其分解为 a 1 a_1 a1 个 1 ⋅ 1 0 k − 1 1\\cdot 10^k-1 1⋅10k−1 , a 2 a_2 a2 个 1 ⋅ 1 0 k − 2 1\\cdot 10^k-2 1⋅10k−2 ,…, a k a_k aCodeforces Round #742 div.2 A-F题解
Codeforces Round #742 div.2 A-F题解
Codeforces Round #742 (Div. 2)A-E
Codeforces Round #742 (Div. 2) E. Non-Decreasing Dilemma 线段树
Codeforces Round #742 (Div. 2) E. Non-Decreasing Dilemma 线段树
Codeforces Round #742 (Div. 2) E. Non-Decreasing Dilemma (线段树维护区间连续问题)