Codeforces Round #804 (Div. 2) A-E题解

Posted 欣君

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #804 (Div. 2) A-E题解相关的知识,希望对你有一定的参考价值。

视频讲解:BV1vN4y1M7cx

A. The Third Three Number Problem

题目大意

给定整数 n ( 1 ≤ n ≤ 1 0 9 ) n(1\\leq n \\leq 10^9) n(1n109) ,求任意一组 a , b , c ( 0 ≤ a , b , c ≤ 1 0 9 ) a,b,c(0 \\leq a,b,c \\leq 10^9) a,b,c(0a,b,c109) ,满足
( a ⊕ b ) + ( b ⊕ c ) + ( a ⊕ c ) = n (a \\oplus b)+(b \\oplus c)+(a \\oplus c)=n (ab)+(bc)+(ac)=n

无解输出 − 1 -1 1

题解

仅考虑最低位的情况,会发现:

  • 若三个数都为 00 00 00 01 01 01 ,则总和为 00 00 00
  • 若一个数为 01 01 01 ,另两个数为 00 00 00 ,则总和为 10 10 10
  • 若一个数为 00 00 00 ,另两个数为 01 01 01 ,则总和为 10 10 10

因此对于任意一位,要不总和为 0 0 0 ,要不向更高位进一位。

因此若 n n n 为奇数,则无解。
有解时,一种合法的方案为 ( n 2 , 0 , 0 ) (\\fracn2,0,0) (2n,0,0)

参考代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

int main()

	int T,n;
	scanf("%d",&T);
	while(T--)
	
		scanf("%d",&n);
		if(n&1)
			printf("-1\\n");
		else
			printf("%d %d %d\\n",n/2,0,0);
	

B. Almost Ternary Matrix

题目大意

给定两个偶数 n , m ( 2 ≤ n , m ≤ 50 ) n,m(2\\leq n,m \\leq 50) n,m(2n,m50) ,求 n × m n \\times m n×m 的01矩阵,满足对于矩阵内任意位置 ( i , j ) (i,j) (i,j) ,在四邻域上均有恰好2个与该元素不同的元素。

题解

用以下矩阵及其旋转90°的矩阵填充即可:

01
10

参考代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

const int MAXN=55;
int a[MAXN][MAXN];

int main()

	int T,n,m,i,j;
	scanf("%d",&T);
	while(T--)
	
		scanf("%d%d",&n,&m);
		memset(a,0,sizeof(a));
		for(i=0;i<n;i+=2)
		
			for(j=0;j<m;j+=2)
			
				if((i/2+j/2)%2)
					a[i][j]=a[i+1][j+1]=1;
				else
					a[i+1][j]=a[i][j+1]=1;
			
		
		for(i=0;i<n;i++)
		
			for(j=0;j<m;j++)
				printf("%d ",a[i][j]);
			puts("");
		
	

C. The Third Problem

题目大意

给定长度为 n n n 1 1 1 n − 1 n-1 n1 的排列 a a a ,求有多少排列 b b b 与排列 a a a “相似”。
“相似”的定义为,对于任意区间 [ l , r ] ( 1 ≤ l ≤ r ≤ n ) [l,r](1 \\leq l \\leq r \\leq n) [l,r](1lrn) ,均有
M E X ( [ a l , a l + 1 , . . . , a r ] ) = M E X ( [ b l , b l + 1 , . . . , b r ] ) MEX([a_l,a_l+1,...,a_r])=MEX([b_l,b_l+1,...,b_r]) MEX([al,al+1,...,ar])=MEX([bl,bl+1,...,br])

题解

根据 M E X MEX MEX 的定义,我们需要从小到大逐个考虑每个数。
p o s i pos_i posi 表示排列 a a a 中元素 i i i 出现的位置。

考虑用类似数学归纳法的思想,求解排列 b b b 的方案数。

初始区间 [ p o s 0 , p o s 0 ] [pos_0,pos_0] [pos0,pos0] M E X MEX MEX 值必须为 1 1 1 ,因此 0 0 0 位置确定,方案数为 1 1 1

设当前区间为 [ l , r ] [l,r] [l,r] 0 0 0 i − 1 i-1 i1 的元素均在改区间中。
对于元素 i i i

  • p o s i ∈ [ l , r ] pos_i\\in [l,r] posi[l,r] ,则在排列 b b b 中元素 i i i 也必须在 [ l , r ] [l,r] [l,r] 中,可选位置数为 r − l + 1 − i r-l+1-i rl+1i ,因此方案数 ∗ ( r − l + 1 − i ) *(r-l+1-i) (rl+1i)
  • p o s i ∉ [ l , r ] pos_i \\notin [l,r] posi/[l,r] ,则在排列 b b b 中元素 i i i 必须在 p o s i pos_i posi 位置上,方案数不变,并且 [ l , r ] [l,r] [l,r] 扩展至 [ m i n ( l , p o s i ) , m a x ( r , p o s i ) ] [min(l,pos_i),max(r,pos_i)] [min(l,posi),max(r,posi)]

参考代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

const ll mod=1e9+7;
const int MAXN=100100;
int pos[MAXN];

int main()

	int T,n,x,i,l,r;
	ll ans;
	scanfCodeforces Round #804 (Div. 2) A-E题解

Codeforces Round #804 (Div. 2) A-E题解

Codeforces Round #804 (Div. 2) A-E题解

Codeforces Round #436 E. Fire(背包dp+输出路径)

[ACM]Codeforces Round #534 (Div. 2)

codeforces 804A Find Amir 思维/水题