CodeForces - 1481C - Fence Painting (贪心)

简介: 笔记

Fence Painting


题意

按顺序使用c 数组中的元素 将 a数组 变成 b 数组 问是否可能,若可能 输出c 中每个元素应该放在a 中的哪个位置


思路

先找到哪些元素需要修改存在q 里


对于c中最后一个元素c[m] 有以下三种情况


1.需要修改的数中有c[m]


2.需要修改的数中没有c[m] 但是不需要修改的数中有c[m]


3.b中没有 c[m]


用 las 表示c[m] 应该修改b 中的哪一个数字的下标


对于 1 直接令las=q[c[m]].back() 即可


对于 2 在 b bb 中找到一个c[m] 对应的下标即可


对于 3 肯定无解 因为c[m] 是最后一个修改的


对于1、2 按顺序遍历c 在q 中找到应该修改哪个位置 如果存在c[i] 不在q 中 那么直接让他先修改c 中最后一个数需要修改的位置 即las 反正最后会被覆盖


然后遍历判断一下q 中改被修改的数是否都被修改了 最后输出答案即可


代码

#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define mod 998244353
#define endl '\n'
using namespace std;
typedef long long LL;
typedef pair<int, int>PII;
const int N = 100100;
int n, m;
int a[N], b[N], c[N]; // a -> b by c
vector<int>q[N];
void solve() {
  cin >> n >> m;
  for (int i = 1; i <= n; ++i)q[i].clear();
  for (int i = 1; i <= n; ++i)scanf("%d", a + i);
  for (int i = 1; i <= n; ++i) {
    scanf("%d", b + i);
    if (b[i] != a[i]) {
      q[b[i]].push_back(i); //找到每一个颜色需要修改的位置
    }
  }
  for (int i = 1; i <= m; ++i)scanf("%d", c + i);
  int las = -1;
  if (q[c[m]].size()) {
    las = q[c[m]].back();
    q[c[m]].pop_back();
  }
  else {
    for (int i = 1; i <= n; ++i) {
      if (b[i] == c[m]) {
        las = i;
        break;
      }
    }
  }
  if (las == -1) {
    puts("NO");
    return;
  }
  vector<int>res(m);
  res[m - 1] = las;
  for (int i = 1; i < m; ++i) {
    if (q[c[i]].size()) {
      res[i - 1] = q[c[i]].back();
      q[c[i]].pop_back();
    }
    else res[i - 1] = las;
  }
  for (int i = 1; i <= n; ++i) {
    if (q[i].size()) {
      puts("NO");
      return;
    }
  }
  puts("YES");
  for (int i = 1; i <= m; ++i) {
    printf("%d%c", res[i - 1], i == m ? '\n' : ' ');
  }
}
int main() {
  int t; cin >> t;
  while (t--)
    solve();
  return 0;
}


目录
相关文章
|
6月前
|
C++
HDU2319— Card Trick
HDU2319— Card Trick
|
算法
light oj 1258 - Making Huge Palindromes(KMP)
ight oj里这个题目是属于KMP分类的,但乍看好像不是kmp,因为只有一个字符串。要想的到一个回文串,把该字符串翻转接到原串后面必然是一个回文串,但并不一定是最短的。我们必须考虑怎么把两个串尽量融合在一起,这就要看翻转串的前段与原串的后段有多少是匹配的了,这里就用到了KMP算法。
34 1
codeforces 317 A Perfect Pair
我先排除了输出-1的,然后再考虑如何计算最小的步数。我们主要在每一步中最小一个加上另一个就可以了,这是朴素的求法,但可能出现这样的情况 比如 -100000000 1 10000000 这样的话会循环100000000多次,肯定超时,所以我们要加快速度。
40 0
luoguP2205 [USACO13JAN]Painting the Fence S(差分 扫描线思想)
luoguP2205 [USACO13JAN]Painting the Fence S(差分 扫描线思想)
57 0
AtCoder Beginner Contest 216 D - Pair of Balls (思维建图 拓扑排序判断有向图是否有环)
AtCoder Beginner Contest 216 D - Pair of Balls (思维建图 拓扑排序判断有向图是否有环)
124 0
|
Perl
AtCoder Beginner Contest 217 F - Make Pair (区间dp)
AtCoder Beginner Contest 217 F - Make Pair (区间dp)
119 0
|
机器学习/深度学习
AtCoder Beginner Contest 218 F - Blocked Roads (最短路径还原 思维)
AtCoder Beginner Contest 218 F - Blocked Roads (最短路径还原 思维)
98 0
POJ-Silver Cow Party (最短路)
POJ-Silver Cow Party (最短路)
95 0
|
人工智能 BI
[UVA 1599] Ideal Path | 细节最短路
Description New labyrinth attraction is open in New Lostland amusement park. The labyrinth consists of n rooms connected by m passages. Each passage is colored into some color ci .
202 0