D. Vasya And The Matrix------Educational Codeforces Round 48 (Rated for Div. 2)

D. Vasya And The Matrix
time limit per test2 seconds
memory limit per test256 megabytes
inputstandard input
outputstandard output
Now Vasya is taking an exam in mathematics. In order to get a good mark, Vasya needs to guess the matrix that the teacher has constructed!

Vasya knows that the matrix consists of n rows and m columns. For each row, he knows the xor (bitwise excluding or) of the elements in this row. The sequence a1, a2, …, an denotes the xor of elements in rows with indices 1, 2, …, n, respectively. Similarly, for each column, he knows the xor of the elements in this column. The sequence b1, b2, …, bm denotes the xor of elements in columns with indices 1, 2, …, m, respectively.

Help Vasya! Find a matrix satisfying the given constraints or tell him that there is no suitable matrix.

Input
The first line contains two numbers n and m (2 ≤ n, m ≤ 100) — the dimensions of the matrix.

The second line contains n numbers a1, a2, …, an (0 ≤ ai ≤ 109), where ai is the xor of all elements in row i.

The third line contains m numbers b1, b2, …, bm (0 ≤ bi ≤ 109), where bi is the xor of all elements in column i.

Output
If there is no matrix satisfying the given constraints in the first line, output “NO”.

Otherwise, on the first line output “YES”, and then n rows of m numbers in each ci1, ci2, … , cim (0 ≤ cij ≤ 2·109) — the description of the matrix.

If there are several suitable matrices, it is allowed to print any of them.

Examples
inputCopy
2 3
2 9
5 3 13
outputCopy
YES
3 4 5
6 7 8
inputCopy
3 3
1 7 6
2 15 12
outputCopy
NO


题意:输入n,m,表示一个矩阵的行数和列数,然后给出矩阵的每行每列的异或值,问是否存在这样的矩阵,存在输出YES并随便输出一个符合条件的矩阵,否则输出NO
解题思路:先将a[1m-1]的异或值填到底num[0][1m-1]的位置,再将b[1n-1]行的异或值填到num[1n-1][0]的位置,然后将第一行的填上的数(也就是b[1n-1]值)再都异或起来得到ans,ans再异或a[0],将得到的数填在num[0][0],剩余没填位置都放0,这样就保证了除去a[1n-1]和b[1m-1]合法。最后就是判断num[0n-1][0]的所有值异或起来是否等于b[0],等于输出yes,并将num打印出来,不等于输出no
代码如下:(因为代码实现省去了num 数组,所以先进行判断是否存在数组,然后根据求出的第一行第一列的数和a[1m-1]和b[1n-1]直接打印出矩阵)


	/*													
	◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇
	◇◇◇◇◇◆◆◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇
	◇◇◇◇◆◆◆◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇
	◇◇◇◇◆◆◆◇◇◇◇◇◆◆◇◇◇◇◇◇◇◇◇◆◆◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◆◆◆◆◆◇
	◇◇◇◇◆◇◆◆◇◇◇◇◆◆◆◆◆◆◇◇◇◆◆◆◆◆◆◇◇◆◆◆◇◆◆◆◇◇◆◆◆◆◆◇◇◇◇◆◆◆◆◆◇
	◇◇◇◆◆◇◆◆◇◇◇◇◇◆◆◇◆◆◇◇◇◆◆◇◇◆◆◇◇◇◆◆◇◆◆◇◇◇◆◆◇◆◆◇◇◇◇◇◆◇◆◆◇
	◇◇◇◆◆◆◆◆◆◇◇◇◇◆◇◇◇◆◇◇◇◆◇◇◇◆◆◇◇◇◆◆◇◆◆◇◇◇◆◆◆◆◆◆◇◇◇◇◆◇◇◇◇
	◇◇◆◆◇◇◇◆◆◇◇◇◇◆◇◇◇◆◇◇◇◆◇◇◇◆◆◇◇◇◇◆◆◆◇◇◇◇◆◆◇◇◇◇◇◇◇◇◆◇◇◇◇
	◇◇◆◆◇◇◇◆◆◇◇◇◇◆◇◇◇◆◇◇◇◆◆◇◇◆◆◇◇◇◇◆◆◆◇◇◇◇◆◆◇◇◆◇◇◇◇◇◆◇◇◇◇
	◇◆◆◆◇◇◆◆◆◆◆◇◆◆◆◇◆◆◆◇◇◆◆◆◆◆◆◇◇◇◇◆◆◇◇◇◇◇◆◆◆◆◆◇◇◇◆◆◆◆◇◇◇
	◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◆◆◇◇◇◇◇◆◆◆◇◇◇◇◇◇◇◆◆◇◇◇◇◇◇◇◇◇◇◇
	◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◆◆◆◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇
	◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇
	*/

#include<stdio.h>
#include<bits/stdc++.h>
#define ll long long int
using namespace std;
const int maxn = 1e3+5;
int num[maxn][maxn];
int a[maxn];
int b[maxn];
int ans,ans1;
int main() {
	int n, m;

	scanf("%d%d", &n, &m);
	for (int i = 0; i < n; i++)scanf("%d", &a[i]);
	for (int i = 0; i < m; i++)scanf("%d", &b[i]);
	for (int i = 1; i < m; i++)ans = ans ^ b[i];	//将第一行的填上的数(也就是b[1~n-1]值)再都异或起来得到ans
	ans = ans ^ a[0];					//ans再异或a[0], 将得到的数填在num[0][0]
	for (int i = 1; i < n; i++)ans1 = ans1 ^ a[i];		//将第一列的填上的数(也就是a[1~m-1]值)再都异或起来得到ans1
	if ((ans^ans1) == b[0])printf("YES\n");		//判断num[0~n - 1][0]的所有值异或起来是否等于b[0],等于输出yes,不等于输出no
	else {
		printf("NO\n"); return 0;
	}
	printf("%d ", ans);
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			if (i == 0 & j == 0)continue;
			else if (i == 0) {
				printf("%d ", b[j]);
			}
			else if (j == 0) {
				printf("%d ", a[i]);
			}
			else printf("0 ");
		}
		printf("\n");
	}

}
### Codeforces Round 260 Div. 1 题目及题解 #### A. Vasya and Multisets 在这道题目中,Vasya有一个由n个整数组成的序列。目标是通过将这些数分成若干组,使得每组中的所有数都相同,并且尽可能减少分组的数量。 为了实现这一目的,可以利用贪心算法来解决这个问题。具体来说,在遍历输入数据的同时维护当前最大频率计数器,对于每一个新遇到的不同数值增加一个新的集合[^1]。 ```cpp #include <bits/stdc++..h> using namespace std; void solve() { int n; cin >> n; unordered_map<int, int> freq; for (int i = 0; i < n; ++i) { int x; cin >> x; freq[x]++; } int maxFreq = 0; for (auto& p : freq) { maxFreq = max(maxFreq, p.second); } cout << maxFreq << "\n"; } ``` #### B. Pashmak and Graph 此问题涉及图论领域的一个经典最短路径计算案例。给定一张带权无向图以及起点S和终点T,要求求出从S到T经过至少一条边后的最小花费总和。 Dijkstra算法适用于此类场景下的单源最短路径查询任务。初始化距离表dist[]为无穷大(INF),仅设置起始节点的距离为零;随后借助优先队列选取未访问过的最近邻接顶点u更新其相邻结点v至目前为止所知的最佳到达成本min{dist[u]+w(u,v)}直至找到终止条件即抵达目的地t或处理完毕所有可达区域内的候选者为止。 ```cpp typedef pair<long long,int> pli; const long long INF = LLONG_MAX / 3; struct Edge { int to, cost; }; vector<Edge> G[MAX_V]; long long d[MAX_V]; bool dijkstra(int s, int t){ priority_queue<pli,vector<pl>,greater<pl>> que; fill(d,d+MAX_V,INF); d[s]=0; que.push(pli(0,s)); while(!que.empty()){ pli p=que.top();que.pop(); int v=p.second; if(d[v]<p.first) continue; for(auto e:G[v]){ if(d[e.to]>d[v]+e.cost){ d[e.to]=d[v]+e.cost; que.push(pli(d[e.to],e.to)); } } } return d[t]!=INF; } ``` #### C. DZY Loves Colors 这是一道关于颜色染色的问题。给出长度为N的一维网格,初始状态下每个格子都有一个默认的颜色编号。现在有M次操作机会改变某些位置上的色彩值,最终目的是统计整个条带上共有几种不同的色调存在。 采用离散化技术预处理原始输入并记录下各段连续同色区间的端点坐标范围,之后针对每一次修改请求动态调整受影响部分的信息结构体(如线段树),最后依据累积的结果得出答案。 ```cpp // 假设已经实现了上述提到的数据结构 SegmentTree 和 update 函数 SegmentTree st; for(int i=1;i<=m;++i){ int l,r,c; scanf("%d%d%d",&l,&r,&c); update(l,r,c); } printf("%lld\n",st.query()); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值