专栏文章

题解:AT_abc424_c [ABC424C] New Skill Acquired

AT_abc424_c题解参与者 3已保存评论 2

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
2 条
当前快照
1 份
快照标识符
@minsdhwt
此快照首次捕获于
2025/12/02 07:34
3 个月前
此快照最后确认于
2025/12/02 07:34
3 个月前
查看原文

题意

就是有一些技能,得到技能 ii 之前必须解锁其他两个技能 aia_ibib_i 中的一个,问最后最多有几个技能。

思路

一开始就有的肯定是 ai=bi=0a_i=b_i=0 的技能。
对于一个新解锁的技能 ii,他能对技能 jj 直接产生影响当且仅当 aja_jbjb_jii
然后就可以把已解锁技能放进一个队列,然后把凡是他能解锁的都解锁了,并放入队列,当然每个技能放一次(计算一次影响)就够了。
然后就没了。

代码

CPP
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+15; 
int vis[N];
vector<int>g[N];
signed main()
{
	int n;
	cin>>n;
	queue<int>q;
	for(int i=1;i<=n;i++) 
	{
		int a,b;
		cin>>a>>b;
		if(a==b&&a==0)
		{
			q.push(i);
			continue;
		}
		g[a].push_back(i);//a做完就可以做i了
		if(a!=b)g[b].push_back(i);
	}
	int res=0;
	while(!q.empty())
	{
		int u=q.front();
		q.pop();
		if(vis[u]) continue;
		res++;
		vis[u]=1;
		for(auto v:g[u])
		{
			if(vis[v]) continue;
			q.push(v);
		}
	}
	cout<<res<<endl;
	return 0;
}

评论

2 条评论,欢迎与作者交流。

正在加载评论...