0
点赞
收藏
分享

微信扫一扫

C. Fence Painting 模拟,vector的应用

自由情感小屋 2022-04-14 阅读 62
c++算法

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();
}


//考虑边界了?
//考虑特殊情况?
//考虑输出中间值勘误?
举报

相关推荐

0 条评论