CF思维E. Replace the Numbers
Posted 行码棋
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CF思维E. Replace the Numbers相关的知识,希望对你有一定的参考价值。
- 博客主页: https://blog.csdn.net/qq_50285142
- 👍欢迎点赞👍⭐️收藏⭐️❤️关注❤️留言 📝 如有错误,敬请指正
- 🎈点击领取大量学习资源🎈
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(思维题)