Codeforces Round #576 (Div. 2) D. Welfare State

在这里插入图片描述在这里插入图片描述
题意:输入一个数组,经过不同的操作后再按原来的顺序输出这个数组。
操作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]]);
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值