【CF】【312div2】【A Simple Task】

E. A Simple Task
time limit per test
5 seconds
memory limit per test
512 megabytes
input
standard input
output
standard output

This task is very simple. Given a string S of length n and q queries each query is on the format i j k which means sort the substring consisting of the characters from i to j in non-decreasing order if k = 1 or in non-increasing order if k = 0.

Output the final string after applying the queries.

Input

The first line will contain two integers n, q (1 ≤ n ≤ 1050 ≤ q ≤ 50 000), the length of the string and the number of queries respectively.

Next line contains a string S itself. It contains only lowercase English letters.

Next q lines will contain three integers each i, j, k (1 ≤ i ≤ j ≤ n).

Output

Output one line, the string S after applying the queries.

Sample test(s)
input
10 5
abacdabcda
7 10 0
5 8 1
1 4 0
3 6 0
7 10 1
output
cbcaaaabdd
input
10 1
agjucbvdfk
1 10 1
output
abcdfgjkuv
A线段树: [a][ ][ ][ ][ ][ ]
B线段树: [ ][b][ ][b][ ][ ]
C线段树: [ ][ ][c][ ][c][ ]
D线段树: [ ][ ][ ][ ][ ][d] 

然后还要注意 m - (m >>1)


#include <iostream>
#include <cstring>
#include <cmath>
#include <queue>
#include <stack>
#include <list>
#include <map>
#include <set>
#include <string>
#include <cstdlib>
#include <cstdio>
#include <algorithm>
using namespace std;

#define lson l,m,rt<<1,id
#define rson m+1,r,rt<<1|1,id

int slen;
int l,r,k;
int qnums;
const int MAXN = 100010;
char str[MAXN];
int add[26][MAXN<<2];
int sum[26][MAXN<<2];
int cnt[26];
char ans[MAXN];
void PushUp(int rt,int id)
{
	sum[id][rt] = sum[id][rt<<1] + sum[id][rt<<1|1];
}
void build(int l,int r,int rt,int id)
{

	add[id][rt] = -1;
	if(l == r)
	{
		int val = str[l-1] - 'a';
		if(val == id) 
		{
			sum[val][rt] = 1;
		}
		//sun[id][rt] = ()
		return ;
	}
	
	int m = (l + r) >> 1;
	build(lson);
	build(rson);
	PushUp(rt,id);
}
void PushDown(int rt,int m,int id)
{
		if(add[id][rt] >= 0) 
	{
		add[id][rt<<1] = add[id][rt];
		add[id][rt<<1|1] = add[id][rt];

		sum[id][rt<<1] = add[id][rt]*(m-(m>>1));
		sum[id][rt<<1|1] = add[id][rt]*(m>>1);
		add[id][rt] = -1;
	}
}

void update(int L,int R,int c,int l,int r,int rt,int id)
{
	if(L <= l && r <= R)
	{
		add[id][rt] = c;
		sum[id][rt] = c * (r - l +1);
		return;
	}

	PushDown(rt,r-l+1,id);
	int m = (l + r) >> 1;
	if(L <= m) update(L,R,c,lson);
	if(m < R) update(L,R,c,rson);
	PushUp(rt,id);
}

int query(int L,int R,int l,int r,int rt,int id)
{
	if(L <= l && r <= R)
	{
		return sum[id][rt];
	}
	PushDown(rt,r-l+1,id);
	int m = (l + r) >> 1;
	int ret = 0;
	if(L <= m) ret += query(L,R,lson);
	if(m < R) ret += query(L,R,rson);
	return ret;
}
int main()
{
	freopen("1.txt","r",stdin);
//	freopen("out.txt","w",stdout);
	while(scanf("%d%d",&slen,&qnums) != EOF)
	{
	//	memset(add,-1,sizeof(add));
		memset(sum,0,sizeof(sum));
	//	memset(str,0,sizeof(str));
		scanf("%s",str);
	
		for(int i=0;i<26;i++)
		{
			build(1,slen,1,i);
		}

		while(qnums --)
		{
			memset(cnt,0,sizeof(cnt));
			memset(ans,0,sizeof(ans));
			scanf("%d%d%d",&l,&r,&k);
			for(int i=0;i<26;i++)
			{
				cnt[i] = query(l,r,1,slen,1,i);
				update(l,r,0,1,slen,1,i);
			}
		

			if(k == 1)
			{
		    	int curleft = l;

				for(int i=0;i<26;i++)
				{
					if(cnt[i] > 0)
					{
					 update(curleft,curleft+cnt[i]-1,1,1,slen,1,i);
							 	}
					curleft = curleft + cnt[i];
				}
			}
			else
			{
			    int curleft = l;

				for(int i=25;i>=0;i--)
				{
					if(cnt[i] > 0)
					update(curleft,curleft+cnt[i]-1,1,1,slen,1,i);
					curleft = curleft + cnt[i];
				}
			}
		
		
	}
			for(int i=1;i<=slen;i++)
			{
				for(int j=0;j<26;j++)
				{
					if(query(i,i,1,slen,1,j))
					{
						ans[i-1] = 'a' + j;
						break;
					}
				}
			}

			printf("%s\n",ans);

	}
}








  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值