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 (1n100) 的方格图,用 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,b0) ,求最小的非负整数数组大小,使得数组的 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 prea1=b ,则数组为 0 0 0 a − 1 a-1 a1 即可,答案为 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 prea1=b,prea1a=b ,则数组为 0 0 0 a − 1 a-1 a1 ,在加任意两个大于 a a a 的元素 x , y x,y x,y,满足 x ⊕ y = a ⊕ b x\\oplus y=a\\oplus b xy=ab 即可,答案为 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 prea1=b,prea1a=b ,则数组为 0 0 0 a − 1 a-1 a1 ,在加一个元素 a ⊕ b a\\oplus b ab 即可,答案为 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 (1n109) ,求有多少对正整数对 ( 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(1nmin(100,s)) 个十进制正整数,其和在十进制下为 s ( 1 ≤ s ≤ 1 0 9 ) s(1 \\leq s \\leq 10^9) s(1s109) 。有人将这 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×11k1 ,显然变小了。

因此得到贪心策略:若 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 110k1 a 2 a_2 a2 1 ⋅ 1 0 k − 2 1\\cdot 10^k-2 110k2 ,…, 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 (线段树维护区间连续问题)