CF链接:Dashboard - Codeforces Round #699 (Div. 2) - Codeforces
此题主要考验代码能力和模拟能力。
考虑到如果c[i]多了,就直接涂到一个h板子上面,h板子为c[m](颜色会覆盖掉)。
然后就是一些vector的应用,back,clear啥的。注意,这里应该是g[b[i]].push_back(i),在b[i]里面推入i。其他的就是一些小细节啦。
这里我第一次提交错了,原因是我是对于g[b[i]].size()!=0的时候clear,应该最开始遍历一遍从1到n直接clear,不然在初始化上贪图这一点点时间。
tlak is cheap,let your code
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define INF 0x7fffffff
#define endl '\n'
#define MOD 998244353
int a[100005],b[100005],c[100005],ans[100005];
vector<int>g[100005];
void solve(){
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++) g[i].clear();
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++) cin>>b[i];
for(int i=1;i<=m;i++) cin>>c[i];
for(int i=1;i<=n;i++) {
if(a[i]!=b[i]) g[b[i]].push_back(i);
}
int flag=0;
if(g[c[m]].size()) flag=g[c[m]].back(),ans[m]=flag,g[c[m]].pop_back();
if(flag==0){
for(int i=1;i<=n;i++) {
if(b[i]==c[m]) {flag=i,ans[m]=flag;break;}
}
}
if(flag==0) {cout<<"NO"<<endl;return;}
for(int i=1;i<m;i++){
if(g[c[i]].size()) ans[i]=g[c[i]].back(),g[c[i]].pop_back();
else ans[i]=flag;
}
int flagg=1;
for(int i=1;i<=n;i++){
if(g[b[i]].size()) flagg=0;
}
if(flagg) {
cout<<"YES"<<endl;
for(int i=1;i<=m;i++) cout<<ans[i]<<" ";
cout<<endl;
}
else {cout<<"NO"<<endl;return;}
}
signed main(){
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
int t;cin>>t;
while(t--) solve();
}
//考虑边界了?
//考虑特殊情况?
//考虑输出中间值勘误?