CF思维E. Replace the Numbers

Posted 行码棋

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CF思维E. Replace the Numbers相关的知识,希望对你有一定的参考价值。

E. Replace the Numbers

题目链接:
https://codeforces.com/problemset/problem/1620/E

q个操作,操作有两种类型。
1️⃣在数组后面添加一个数字
2️⃣对数组中所有值为x的变为y
求最终形成的数组。


1️⃣影响复杂度的是第二种操作,如果将一个数组中所有的x变为y,极其影响复杂度,考虑使用数组标记。

2️⃣p[i] = j代表数组中所有的i变为j

3️⃣从前往后操作的话,出现第二种操作:它的作用域在该数之前,但是我们没有好的办法进行改变。所以我们可以从后往前来,先用p[i]记录i变为j 然后之后出现i的话,直接将p[i]加入答案中。

这样类似由结果往前推导,有点类似后缀数组计算。

4️⃣最后的答案是倒序的,我们只要反转一下即可

#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
typedef long long ll;
const int N = 5e5+5;

int p[N];
void solve()

	int n;
	cin>>n;
	vector<int>q(n+1),x(n+1),y(n+1);
	for(int i=1;i<=n;i++)
	
		cin>>q[i]>>x[i];
		if(q[i]==2) cin>>y[i];
	
	for(int i=1;i<N;i++) p[i] = i;

	vector<int>res;
	for(int i=n;i>=1;i--)
	
		if(q[i]==1) res.push_back(p[x[i]]);
		else p[x[i]] = p[y[i]];
	
	reverse(res.begin(),res.end());
	for(auto i : res) cout<<i<<' ';
	cout<<endl;

int main()

	ios::sync_with_stdio(false);
	cin.tie(0);
	int t;
//	cin>>t;
	t = 1;
	while(t--) solve();
	return 0;
  

往期优质文章推荐

领取大量学习资源

以上是关于CF思维E. Replace the Numbers的主要内容,如果未能解决你的问题,请参考以下文章

CF 1215 B The Number of Products(思维题)

E. Magic Stones CF 思维题

E. DeadLee 思维 贪心 cf官方答案代码详解

E. Bus Number cf991

CF 1117 E. Decypher the String

E. Common Number (思维 + 规律)