求助
  • 板块CF240F TorCoder
  • 楼主_RTST_
  • 当前回复1
  • 已保存回复1
  • 发布时间2022/12/27 19:14
  • 上次更新2023/10/24 06:23:49
查看原帖
求助
918990
_RTST_楼主2022/12/27 19:14
#include<iostream>
#include <string>
#define mn 100010
#define ls x<<1|1
#define rs x<<1
using namespace std;
struct node
{
	int l,r;
	int ch[27];
	int tag;
}tr[mn<<2];
int n,m;
inline void pushup(int x)
{
	for(int i=1;i<=26;++i)tr[x].ch[i]=tr[ls].ch[i]+tr[rs].ch[i];
}
inline void pushdown(int x)
{
	if(!tr[x].tag)return;
	for(int i=1;i<=26;++i)tr[ls].ch[i]=tr[rs].ch[i]=0;
	tr[ls].tag=tr[x].tag,tr[rs].tag=tr[x].tag;
	tr[ls].ch[tr[ls].tag]=tr[ls].r-tr[ls].l+1;
	tr[rs].ch[tr[rs].tag]=tr[rs].r-tr[rs].l+1;
	tr[x].tag=0;
}
inline void build(int x,int l,int r)
{
	tr[x].l=l,tr[x].r=r;
	for(int i=1;i<=26;++i)tr[x].ch[i]=0;
	char c;
	if(l==r)
	{
		cin>>c;
		tr[x].ch[c-'a'+1]=1;
        return;
	}
	int mid=(l+r)>>1;
	build(ls,l,mid);
	build(rs,mid+1,r);
	pushup(x);
}
int num[27];
inline bool check(int l,int r)
{
	bool flag=0;
    for(int i=1;i<=26;++i)
	    if(num[i]&1)
		{
			if(flag || (r-l+1)%2==0)return 1;
			flag=1;
		}
    return 0;
}
inline void query(int x,int l,int r)
{
	if(l>tr[x].r || r<tr[x].l)return;
	if(l<=tr[x].l && tr[x].r<=r)
	{
		for(int i=1;i<=26;++i)num[i]+=tr[x].ch[i];
		return;
	}
	pushdown(x);
	query(ls,l,r);
	query(rs,l,r);
}
inline void update(int x,int l,int r,int k)
{
	if(l>tr[x].r || r<tr[x].l)return;
	if(l<=tr[x].l && tr[x].r<=r)
	{
		for(int i=1;i<=26;++i)tr[x].ch[i]=0;
		tr[x].tag=k;
		tr[x].ch[k]=tr[x].r-tr[x].l+1;
		return ;
	}
	pushdown(x);
	int mid=(l+r)>>1;
	update(ls,l,r,k);
	update(rs,l,r,k);
	pushup(x);
}
inline void print(int x,int l,int r)
{
	if(l==r)
	{
		for(int i=1;i<=26;++i)
		    if(tr[x].ch[i])
			{
				cout<<char(i+'a'-1);
				break;
			}
		return;
	}
	int mid=(l+r)>>1;
	print(ls,l,mid);
	print(rs,mid+1,r);
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	freopen("input.txt","r",stdin);
	freopen("output.txt","w",stdout);
    cin>>n>>m;
	build(1,1,n);
	int l,r;
	while(m--)
	{
        cin>>l>>r;
		for(int i=1;i<=26;++i)num[i]=0;
		query(1,l,r);
		if(check(l,r))continue;
		for(int i=1;i<=26;++i)
		{
			if(!num[i])continue;
			if(num[i]&1)update(1,(l+r)/2,(l+r)/2,i);
			update(1,l,l+num[i]/2-1,i);
            update(1,r-num[i]/2+1,r,i);
			l+=num[i]/2;
			r-=num[i]/2;
		}
	}
	print(1,1,n);
	return 0;
}
2022/12/27 19:14
加载中...