飞道的博客

【CodeForces】CF1481C-Fence Painting【模拟】

415人阅读  评论(0)

CodeForces1481C

题意

有一个围栏,每一块上都有颜色,用A数组来表示,Bob觉得太单调了,他想涂成B数组的颜色。这时候有m个粉刷匠,每个粉刷匠能且只能粉刷一次围栏,问你通过这m个人的粉刷能否达到Bob的要求。如果可以输出YES,并把每个粉刷匠粉刷的下标输出,否则输出NO。

思路

本题需要思考的地方在这:对于最后一个元素,如果b数组中不存在和最后一个相同的元素,那么无论如何也满足不了要求。而且如果C数组出现了B数组中不期望的元素,那么这些元素尽量要涂在同一个元素上,而且被涂的元素后面要出现,例如样例1的第三个case。

还一个需要注意的地方是最后查询的时候要倒序查询,为什么要倒序?对于

2 2 2
2 2 2
2 3 2

这组样例,对于3这个颜色,B数组中并没有出现,我们要把它粉刷在他后面那个人可以粉刷的颜色上。

想通了以上两点,是模拟去实现了,这里贴一个简洁的代码实现。

AC代码


   
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const  int maxn =  1e5+ 10;
  4. int a[maxn];
  5. int b[maxn];
  6. int c[maxn];
  7. vector< int> v[maxn];
  8. int main(void){
  9.   int t;
  10.  cin >> t;
  11.  while(t--){
  12.    int n,m;
  13.   cin >> n >> m;
  14.    for( int i =  1; i <= n; i++) cin >> a[i];
  15.    for( int i =  1; i <= n; i++) cin >> b[i];
  16.    for( int i =  1; i <= m; i++) cin >> c[i];
  17.    int flag =  0;
  18.    for( int i =  1; i <= n; i++){
  19.       if(b[i]==c[m]) flag = i;
  20.   }
  21.    if(flag== 0){
  22.      cout<< "NO"<<endl;
  23.       continue;
  24.   }
  25.    int cnt =  0;
  26.    for( int i =  1; i <= n; i++){
  27.     if(a[i]!=b[i]){
  28.       v[b[i]].push_back(i);
  29.       cnt++;
  30.      }
  31.   }
  32.   vector< int> ans;
  33.    for( int i = m; i >=  1; i--){
  34.       if(v[c[i]].size()== 0){      
  35.          if(i==m) ans.push_back(flag); 
  36.          else ans.push_back(ans[ 0]);  
  37.          continue;
  38.      }
  39.      ans.push_back(v[c[i]].back());
  40.      v[c[i]].pop_back();
  41.      cnt--;
  42.   }
  43.    if(cnt) cout<< "NO"<<endl;
  44.    else{
  45.      cout<< "YES"<<endl;
  46.      reverse(ans.begin(),ans.end());
  47.       for(auto x:ans) cout<<x<< " ";
  48.      cout<<endl;
  49.     }
  50.      for( int i =  1; i<= n; i++) v[i].clear();
  51.    }
  52.   return  0;
  53. }

注意:多组Test,容器一定要清空!!!


转载:https://blog.csdn.net/wxd1233/article/details/113733634
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场