萌新RE求助,悬赏关注(第一次写线段树)
查看原帖
萌新RE求助,悬赏关注(第一次写线段树)
461616
Judgelight楼主2023/3/7 22:58
#include<bits/stdc++.h>
#define int long long
#define N 200009
using namespace std;
int n,m,a[N];
struct Node{
	int l,r,sum,flag;
}tr[N][29];
void pushup(int u,int id){
	tr[u][id].sum=tr[u<<1][id].sum+tr[u<<1|1][id].sum;
}
void eval(Node &t,int flag){
	if(flag==-1){
		return ;
	}
	t.sum=(t.r-t.l+1)*flag;
	t.flag=flag;
}
void pushdown(int u,int id){
	eval(tr[u<<1][id],tr[u][id].flag);
	eval(tr[u<<1|1][id],tr[u][id].flag);
	tr[u][id].flag=-1;
}
void build(int u,int l,int r,int id){
	tr[u][id].l=l,tr[u][id].r=r,tr[u][id].sum=0,tr[u][id].flag=-1;
	if(l==r){
		tr[u][id].sum=(a[l]==id);
		return ;
	}
	int mid=(l+r)>>1;
	build(u<<1,l,mid,id);
	build(u<<1|1,mid+1,r,id);
	pushup(u,id);
}
void modify(int u,int l,int r,int x,int id){
	if(tr[u][id].l>=l&&tr[u][id].r<=r){
		eval(tr[u][id],x);
		return ;
	}
	pushdown(u,id);
	int mid=(tr[u][id].l+tr[u][id].r)>>1;
	if(l<=mid){
		modify(u<<1,l,r,x,id);
	}
	if(r>mid){
		modify(u<<1|1,l,r,x,id);
	}
	pushup(u,id);
}
int query(int u,int l,int r,int id){
	if(tr[u][id].l>=l&&tr[u][id].r<=r){
		return tr[u][id].sum;
	}
	pushdown(u,id);
	int mid=(tr[u][id].l+tr[u][id].r)>>1,ans=0;
	if(l<=mid){
		ans+=query(u<<1,l,r,id);
	}
	if(r>mid){
		ans+=query(u<<1|1,l,r,id);
	}
	return ans;
}
void print(){
	for(int i=1;i<=n;i++){
		int pos;
		for(int j='a';j<='z';j++){
			if(query(1,i,i,(int)(j-'a'))>0){
				pos=(int)(j-'a');
				break;
			}
		}
		cout<<(char)(pos+'a');
	}
}
signed main(){
	freopen("input.txt","r",stdin);
	freopen("output.txt","w",stdout);
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		char c;
		cin>>c;
		a[i]=(int)(c-'a');
	}
	for(int i='a';i<='z';i++){
		build(1,1,n,(int)(i-'a'));
	}
	int sum[26];
	for(int i=1;i<=m;i++){
		int l,r;
		cin>>l>>r;
		int odd=0,pos;
		for(int j='a';j<='z';j++){
			sum[(int)(j-'a')]=query(1,l,r,(int)(j-'a'));
			if(sum[(int)(j-'a')]%2==1){
				odd++;
				pos=(int)(j-'a');
			}
		}
		if(odd>1){
			continue;
		}
		for(int j='a';j<='z';j++){
			modify(1,l,r,0,(int)(j-'a'));
		}
		int lpos=l,rpos=r;
		if(odd==1){
			modify(1,(l+r)>>1,(l+r)>>1,1,pos);
			sum[pos]--;
		}
		for(int j='a';j<='z';j++){
			if(!sum[(int)(j-'a')]){
				continue;
			}
			modify(1,lpos,lpos+sum[(int)(j-'a')]/2-1,1,(int)(j-'a'));
			lpos=lpos+sum[(int)(j-'a')]/2-1+1;
			modify(1,rpos-sum[(int)(j-'a')]/2+1,rpos,1,(int)(j-'a'));
			rpos=rpos-sum[(int)(j-'a')]/2+1-1;
		}
	}
	print();
	return 0;
}
2023/3/7 22:58
加载中...