CF 704 (Div. 2) E

Codeforces Round #704 (Div. 2) E

题解:

把第一个数组当成初始序列,查看其它序列,进行修改,最终求出答案

先分析直接有答案的:
如果初始序列和其他序列进行对比不同项 不超过2个,初始序列即为答案。

如果初始序列和其他序列进行对比不同项 超过4个,不可能有答案。
然后分析如何进行修改,对于 除了初始序列剩下的序列 与 初始序列进行对比:
不同项有四个,那么必然得修改其中的任意两个,共6中情况,修改后查看其他序列是否符合要求。

不同项最大为三个,任意选出不同项为三个的序列进行修改即可,原因是如果该序列修改完不能满足要求的话,不可能有答案。

不同项为三个,可以只修改一个点,也可以修改两个点,这得分类讨论。如果修改一个点的话,允许其他序列修改一个值。
#include <cstdio>
#include <cstring>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
#define pb push_back

const int N = 250020;

int n, m;
vector <int> v[N];

void print(){
	cout << "Yes" << endl;
	for(int i = 0;i < m;i ++) 
		cout << v[0][i] << " ";
	cout << endl;
}

int check(){
	for(int i = 1;i < n;i ++) {
		int num = 0;
		for(int j = 0;j < m;j ++) {
			if(v[0][j] != v[i][j]) 
				num ++;
		}
		if(num >= 3) return 0;
	}
	print();
	return 1;
}

bool change(int y){
    int st = 0,save;
    for(int i = 1;i < n;i ++){
        int k = 0;
        for(int j = 0;j < m;j ++){
            if(!st && j == y) continue;
            if(v[i][j] != v[0][j]) k ++;
        }
        if(k >= 3){
            if(st) v[0][y] = save;
            return 0;
        }
        if(k==2&&!st){
            save = v[0][y];
            v[0][y] = v[i][y];
            st = 1;
        }
    }
    print();
    return 1;
}

int main(){
	int x;
	scanf("%d%d", &n, &m);
	for(int i = 0;i < n;i ++) {
		for(int j = 0;j < m;j ++) {
			scanf("%d",&x);
			v[i].pb(x);
		}
	}
	int t, st = 0, yes = 1;
	for(int i = 1;i < n;i ++) {
		int num = 0;
		for(int j = 0;j < m;j ++) {
			if(v[0][j] != v[i][j]) 
				num ++;
		}
		if(num > 4) {
			cout << "No" << endl;
			return 0;
		}
		if(num == 3 && st == 0) {
			t = i;
			yes = 0;
		}
		if(num == 4) {
			t = i;
			st = 1;
			yes = 0;
		}
	}

	if(yes == 1){
		print();
		return 0;
	}

	vector <int> z;
	for(int i = 0;i < m;i ++) 
		if(v[0][i] != v[t][i])
			z.pb(i);
	
	if(st == 0){ // 3
		for(int i = 0;i < z.size();i ++) {
			int save1 = v[0][z[i]];
			v[0][z[i]] = v[t][z[i]];
			if(check()) return 0;
			for(int j = 0;j < z.size();j ++) {
				if(i == j) continue;
				if(change(z[j])) return 0;        //!
			}
			v[0][z[i]] = save1;
		}
	}
	else{ // 4		
		for(int i = 0;i < z.size();i ++) {
			int save1 = v[0][z[i]];
			v[0][z[i]] = v[t][z[i]];
			for(int j = i + 1;j < z.size();j ++) {
				int save2 = v[0][z[j]];
				v[0][z[j]] = v[t][z[j]];
				if(check()) return 0;
				v[0][z[j]] = save2;
			}
			v[0][z[i]] = save1;
		}
	}
	cout << "No" << endl;
	return 0;
}
/*
9 9
1 2 2 2 2 1 2 2 2
1 2 2 1 1 2 2 2 1
1 2 2 1 2 2 2 2 1
1 2 2 1 2 2 1 2 1
1 2 2 1 2 2 1 2 1
1 2 2 1 2 2 2 2 1
1 2 2 2 1 1 2 2 1
1 2 2 2 1 1 2 2 1
1 2 1 2 2 2 2 2 1

Yes
1 2 2 2 2 2 2 2 1

5 5
1  2  3  4  5
6 11  3  4  7
1  8  3 12 16
1 13  3  4 17
1  8 14  4 15

Yes
1  8  3  4  7
*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
<!DOCTYPE html><html lang=en><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no"><link rel=icon href=/favicon.ico><link rel=stylesheet type=text/css id=style href=/mob.css><title>泰迪内推</title><link href=/static/css/chunk-213d46f9.6699f04d.css rel=prefetch><link href=/static/css/chunk-27f03f86.a14eed06.css rel=prefetch><link href=/static/css/chunk-3e1db89a.80dc307b.css rel=prefetch><link href=/static/css/chunk-43ac0f34.b39cf2e8.css rel=prefetch><link href=/static/css/chunk-47eb0788.1ef261ba.css rel=prefetch><link href=/static/css/chunk-4df08e90.c15bd54f.css rel=prefetch><link href=/static/css/chunk-604a0331.222a69ed.css rel=prefetch><link href=/static/css/chunk-706e4bb8.ba0c435d.css rel=prefetch><link href=/static/css/chunk-aa019e9e.a24ffcbe.css rel=prefetch><link href=/static/css/chunk-b2d8146e.9f5c8495.css rel=prefetch><link href=/static/js/chunk-0bd9655e.5d19cfbe.js rel=prefetch><link href=/static/js/chunk-213d46f9.5bf0f607.js rel=prefetch><link href=/static/js/chunk-27f03f86.5642dd75.js rel=prefetch><link href=/static/js/chunk-2d0b35ec.0914afe2.js rel=prefetch><link href=/static/js/chunk-2d0dd3b6.0661684c.js rel=prefetch><link href=/static/js/chunk-2d217c6c.0552e504.js rel=prefetch><link href=/static/js/chunk-3e1db89a.32ad918c.js rel=prefetch><link href=/static/js/chunk-43ac0f34.cae47384.js rel=prefetch><link href=/static/js/chunk-47eb0788.f22bea25.js rel=prefetch><link href=/static/js/chunk-4c5e9add.e9181098.js rel=prefetch><link href=/static/js/chunk-4df08e90.a647fb2c.js rel=prefetch><link href=/static/js/chunk-50ab568d.23c2b33f.js rel=prefetch><link href=/static/js/chunk-580d01b5.865ed0ae.js rel=prefetch><link href=/static/js/chunk-604a0331.ff94cd57.js rel=prefetch><link href=/static/js/chunk-706e4bb8.cc1fe1f6.js rel=prefetch><link href=/static/js/chunk-70d08bcf.6283edd1.js rel=prefetch><link href=/static/js/chunk-aa019e9e.a3ad5f18.js rel=prefetch><link href=/static/js/chunk-b2d8146e.cc40e92f.js rel=prefetch><link href=/static/js/chunk-c5bd1154.0a2126f9.js rel=prefetch><link href=/static/js/chunk-f5ae8c94.d4d5a49c.js rel=prefetch><link href=/static/css/chunk-vendors.a57aa87f.css rel=preload as=style><link href=/static/css/frontend.8e826938.css rel=preload as=style><link href=/static/js/chunk-vendors.ce9424b8.js rel=preload as=script><link href=/static/js/frontend.6f4ec638.js rel=preload as=script><link href=/static/css/chunk-vendors.a57aa87f.css rel=stylesheet><link href=/static/css/frontend.8e826938.css rel=stylesheet></head><body><div id=app></div><script src=/static/js/chunk-vendors.ce9424b8.js></script><script src=/static/js/frontend.6f4ec638.js></script></body></html>
最新发布
06-08
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值