Codeforces - Mass Change Queries

题目链接:Codeforces - Mass Change Queries


比较巧妙的线段树,利用线段树一直下推lazy。

每个节点100个lazy,分别表示 lazy[i]=x,表示i会变成x。


AC代码:

#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
//#define int long long
using namespace std;
const int N=2e5+10;
int a[N],n,q;
int lazy[N<<2][110],sum[N<<2];
void build(int p,int l,int r){
	for(int i=1;i<=100;i++)	lazy[p][i]=i;
	if(l==r){scanf("%d",&sum[p]); return ;}
	int mid=l+r>>1;
	build(p<<1,l,mid),build(p<<1|1,mid+1,r);
}
inline void push_down(int p){
	for(int k=1;k<=100;k++){
		lazy[p<<1][k]=lazy[p][lazy[p<<1][k]];
		lazy[p<<1|1][k]=lazy[p][lazy[p<<1|1][k]];
	}
	for(int k=1;k<=100;k++)	lazy[p][k]=k;
}
void change(int p,int l,int r,int ql,int qr,int x,int y){
	if(l==ql&&r==qr){for(int i=1;i<=100;i++) if(lazy[p][i]==x) lazy[p][i]=y; return ;}
	int mid=l+r>>1;	push_down(p);
	if(qr<=mid)	change(p<<1,l,mid,ql,qr,x,y);
	else if(ql>mid)	change(p<<1|1,mid+1,r,ql,qr,x,y);
	else change(p<<1,l,mid,ql,mid,x,y),change(p<<1|1,mid+1,r,mid+1,qr,x,y);
}
void ask(int p,int l,int r){
	if(l==r){printf("%d ",lazy[p][sum[p]]); return ;}
	int mid=l+r>>1;	push_down(p);
	ask(p<<1,l,mid),ask(p<<1|1,mid+1,r);
}
signed main(){
	cin>>n;	build(1,1,n);	cin>>q;
	for(int i=1,l,r,x,y;i<=q;i++)
		scanf("%d %d %d %d",&l,&r,&x,&y),change(1,1,n,l,r,x,y);
	ask(1,1,n);
	return 0;
}
发布了725 篇原创文章 · 获赞 244 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/weixin_43826249/article/details/104887738
今日推荐