wa7求调,左右边界变化了的
  • 板块CF240F TorCoder
  • 楼主user9756
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/12/16 16:26
  • 上次更新2024/12/16 20:42:58
查看原帖
wa7求调,左右边界变化了的
1087186
user9756楼主2024/12/16 16:26
#include <bits/stdc++.h>
using namespace std;
using ll = int;
const ll inf = 2e18;
constexpr int N = 1e5+2;
#define pi pair<ll, ll>
#define lc p<<1
#define rc p<<1|1
ll w[26][N];
struct tree{
	ll l,r,sum,add;
}tr[26][N<<2];
void pushup(ll k,ll p)
{
	tr[k][p].sum=tr[k][lc].sum+tr[k][rc].sum;
}
void pushdown(ll k,ll p)
{
	if(tr[k][p].add)
	{
		for(ll j=0;j<26;j++) 
		tr[j][lc].sum=tr[j][rc].sum=tr[j][lc].add=tr[j][rc].add=0;
		tr[k][lc].add=tr[k][rc].add=tr[k][p].add;
		tr[k][lc].sum=(tr[k][lc].r-tr[k][lc].l+1)*tr[k][p].add;
		tr[k][rc].sum=(tr[k][rc].r-tr[k][rc].l+1)*tr[k][p].add;
		//tr[k][lc].sx=tr[k][rc].sx=tr[k][p].sx;
		tr[k][p].add=0;
	}
}
void build(ll p,ll l,ll r,ll k)
{
	tr[k][p]={l,r,w[k][l],0};
	if(l==r) return;
	ll m=(l+r)>>1;
	build(lc,l,m,k);
	build(rc,m+1,r,k);
	pushup(k,p);
}
void update(ll p,ll x,ll y,ll k)
{
	if(tr[k][p].l>=x&&tr[k][p].r<=y)//点修区修无所谓
	{
		for(ll j=0;j<26;j++) tr[j][p].sum=tr[j][p].add=0;
		tr[k][p].sum=(tr[k][p].r-tr[k][p].l+1)*(k+1);
		//tr[k][p].sx=k+1;
		tr[k][p].add=k+1;
		return;
	}
	ll m=(tr[k][p].l+tr[k][p].r)>>1;
	pushdown(k,p);
	if(x<=m) update(lc,x,y,k);
	if(y>m) update(rc,x,y,k);
	pushup(k,p);
}
ll query(ll p,ll x,ll y,ll k)//改变查询方式,去查询最左边的那个满足的区间
{
	if(x<=tr[k][p].l&&tr[k][p].r<=y)
		return tr[k][p].sum;
	ll m=(tr[k][p].l+tr[k][p].r)>>1;
	pushdown(k,p);
	ll sum=0;
	if(x<=m) sum+=query(lc,x,y,k);
	if(y>m) sum+=query(rc,x,y,k);
	return sum;
}
void solve()
{
	ll n,q;cin>>n>>q;
    string s;cin>>s;
	s=' '+s;
	for(ll i=1;i<=n;i++) w[s[i]-'a'][i]=s[i]-'a'+1;
	for(ll i=0;i<26;i++) build(1,1,n,i);
	//cout<<query(1,1,n,0);
	while(q--)
	{
		ll l,r;cin>>l>>r;
		vector<ll>c(26);
		ll ji=-1,cnt=0,be=l,en=r;;
		for(ll i=0;i<26;i++) {
			c[i]=query(1,l,r,i)/(i+1);
			if(c[i]&1) cnt++,ji=i;
		}
		if(cnt>1) continue;
		if(cnt==1){
			ll mid=(r-l)/2+l;
			c[ji]=0;
			update(1,mid,mid,ji);
		}
		for(ll i=0;i<26;i++)
		{
			if(!c[i]) continue;
			ll x=c[i]/2;
			update(1,be,be+x-1,i);
			update(1,en-x+1,en,i);
			be+=x;
			en-=x;
		}
	}
	for(ll i=0;i<26;i++)
	query(1,1,n,i);
	//cout<<query(1,1,n,0);
	for(ll i=1;i<=n;i++)
	{
		for(ll j=0;j<26;j++)
		{
			if(query(1,i,i,j))
			{
				cout<<char(j+'a');
				break;
			}
		}
	}

}
int main()
{
	freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
// #ifdef LOCAL
//     freopen("in.txt", "r", stdin);
//     freopen("out.txt", "w", stdout);
// #endif
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);
    int T = 1;
    //cin >> T;
    while (T--)
        solve();
    return 0;
}
2024/12/16 16:26
加载中...