C题线段树TLE求助
  • 板块学术版
  • 楼主yaodiguoan
  • 当前回复11
  • 已保存回复11
  • 发布时间2024/2/24 21:48
  • 上次更新2024/2/25 10:28:01
查看原帖
C题线段树TLE求助
1023793
yaodiguoan楼主2024/2/24 21:48

记录

#include <bits/stdc++.h>
using namespace std;
#define hh printf("\n")
#define kg printf(" ")
#define ls p*2
#define rs p*2+1
namespace quickread{
	inline int read(){
		int x=0,f=1;char ch=getchar();
		while (ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
		while (ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
		return x*f;
	}
	inline char readchar(){
		char ch=getchar();
		while(!(ch>='a'&&ch<='z')) ch=getchar();
		return ch;
	}
}
using namespace quickread;
const int N=2e5+10;
int n,a[N],segment_tree[N*5],lazy[N*5];
void push_up(int p){
	if(segment_tree[ls]==segment_tree[rs]) segment_tree[p]=segment_tree[ls];
	else segment_tree[p]=-1;
}
void push_down(int p){
	if(lazy[p]==-1) return;
	segment_tree[ls]=segment_tree[rs]=lazy[p];
	lazy[ls]=lazy[rs]=lazy[p];
	lazy[p]=-1;
}
void build(int l,int r,int p){
	segment_tree[p]=lazy[p]=-1;
	if(l==r){
		segment_tree[p]=a[l];
		return;
	}
	int m=l+r>>1;
	build(l,m,ls),build(m+1,r,rs);
	push_up(p);
}
void update(int l,int r,int p,int u,int v){
	if(segment_tree[p]==u){
		segment_tree[p]=lazy[p]=v;
		return;
	}
	if(l==r) return;
	if(segment_tree[p]!=-1) return;
	push_down(p);
	int m=l+r>>1;
	update(l,m,ls,u,v),update(m+1,r,rs,u,v);
	push_up(p);
}
void query(int l,int r,int p){
	if(segment_tree[p]!=-1){
		for(int i=l;i<=r;i++) a[i]=segment_tree[p];
		return;
	}
	push_down(p);
	int m=l+r>>1;
	query(l,m,ls),query(m+1,r,rs);
}
signed main(){
//	ios::sync_with_stdio(0);
//	cin.tie();cout.tie();
	n=read();
	for(int i=1;i<=n;i++) a[i]=readchar()-'a';
	build(1,n,1);
	int m=read();
	for(int i=1;i<=m;i++){
		int x=readchar()-'a',y=readchar()-'a';
		if(x==y) continue;
		update(1,n,1,x,y);
	}
	query(1,n,1);
	for(int i=1;i<=n;i++) putchar(a[i]+'a');
	return 0;
}

2024/2/24 21:48
加载中...