题意:输入一个数组,经过不同的操作后再按原来的顺序输出这个数组。
操作1:将第x个数换成y
操作2:将所有小于x的数换成x
思路:如果每次都实现操作2的步骤肯定会Tle,所有我们要对每次的操作2进行处理。具体怎么实现呢?
我是用一个idx来记录进行了第几次2操作了,然后用last[i]=idx来记录最近修改第i个数值的时候已经进行了多少次的2操作了。用p[i]来记录第i次p操作将所有的数修改成什么。
为什么要这个p[i]呢,p[i]和last[i]结合可以知道这个1操作之后的2操作是否改了这个数,
下面是一个例子,感受一下0.0
下面是AC代码?
#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 5;
int a[maxn], last[maxn], p[maxn];
int main()
{
int n; cin >> n;
for (int i = 0; i < n; i++)
cin >> a[i];
int q; cin >> q;
int caozuo;
int idx = 0;
vector<int>vec;
while (q--)
{
cin >> caozuo;
if (caozuo == 1)
{
int x, y; cin >> x >> y;
x--;
a[x] = y;
last[x] = idx;//最后一次修改是在第几次2操作之后
}
else
{
int x; cin >> x;
vec.push_back(x);
idx++; //记录2操作的次数
}
}
int m = vec.size();
p[m] = 0;
for (int i = m - 1; i >= 0; i--)
p[i] = max(vec[i], p[i + 1]);//假设:三次2操作分别是 2 6 3 p[2]=3;p[1]=6;p[0]=6;
//意思就是如果后一次操作修改的数大于前一次操作修改的数,那么数肯定都修改成最大的那个
//假设在第一次2操作之前将一个数改成3了,那第一次2操作这个数不变,但是第二次2操作这个数就变了
for (int i = 0; i < n; i++)
{
if (i) cout << " ";
cout << max(a[i], p[last[i]]);
}
}