B. Welfare State(RMQ问题的逆向考虑)

\(对于操作1,我们只关心最后一次操作。\)

\(对于操作2,我们只关心值最大的一次操作。\)

\(也就是说,我们记录每个居民最后一次被修改的位置\)

\(然后它的最终答案就是从这个位置起,max(操作2最大的一次,最后一次修改的值)\)

\(当然,如果没有被修改过,默认被修改的位置在0.\)

\(\color{Red}{话说回来真的很佩服那些写线段树的人,为什么我不会用线段树呢(●ˇ∀ˇ*|}\)

#include <bits/stdc++.h>
using namespace std;
const int maxn=2e5+9;
int n,w,da[maxn],b[maxn],vis[maxn];
inline int max(int a,int b){return a>b?a:b;}
struct p{
	int lei,num,x;
}a[maxn];
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)	scanf("%d",&b[i]);
	scanf("%d",&w);
	for(int i=1;i<=w;i++)
	{
		scanf("%d",&a[i].lei);
		if(a[i].lei==1)
		{
			scanf("%d%d",&a[i].num,&a[i].x);
			vis[a[i].num]=i,b[a[i].num]=a[i].x;	
		}
		else
			scanf("%d",&a[i].x);
	}
	for(int i=w;i>=1;i--)
	{
		if(a[i].lei==1)	da[i]=da[i+1];//不是修改区间就继承最大 
		else	da[i]=max(da[i+1],a[i].x);//否则尝试更新最大 
	}
	da[0]=da[1];
	for(int i=1;i<=n;i++)
	{
		int xu=vis[i];//最后一次被修改的位置
		printf("%d ",max(da[xu],b[i])); 
	}
}

猜你喜欢

转载自www.cnblogs.com/iss-ue/p/12813986.html