A Simple Task(Codeforces Round #312 (Div. 2) 线段树+计数排序)

来源:互联网 发布:淘宝企业店铺对公账户 编辑:程序博客网 时间:2024/06/05 21:56
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 5abacdabcda7 10 05 8 11 4 03 6 07 10 1
output
cbcaaaabdd
input
10 1agjucbvdfk1 10 1
output
abcdfgjkuv
Note

First sample test explanation:





    题意:输出一段字符串经过m次排序后的序列,x,y,k.当k==1时代表x-y区间

的字符串进行降序排列看k== 0时代表x-y的区间进行升序排列

点击打开链接


#include<iostream>#include<algorithm>#include<stdio.h>#include<string.h>#include<stdlib.h>#define N 100005struct node{    int l;    int r;    int mid;    int ans;    int lz;}q[26][N<<2];char str[N];int n,m;int num[26];char ss[N];void build(int l,int r,int rt,int id){    int mid = (l+r)>>1;    q[id][rt].l = l;    q[id][rt].r = r;    q[id][rt].lz = -1;    q[id][rt].mid = mid;    if(l+1 == r)    {        q[id][rt].ans = (str[l-1] == 'a'+id);        return ;    }    build(l,mid,rt<<1,id);    build(mid,r,rt<<1|1,id);    q[id][rt].ans = q[id][rt<<1].ans + q[id][rt<<1|1].ans;}void push_down(int rt,int id){    if(q[id][rt].lz>=0)    {        q[id][rt<<1].ans = (q[id][rt<<1].r - q[id][rt<<1].l)*q[id][rt].lz;        q[id][rt<<1].lz = q[id][rt].lz;        q[id][rt<<1|1].ans = (q[id][rt<<1|1].r - q[id][rt<<1|1].l)*q[id][rt].lz;        q[id][rt<<1|1].lz = q[id][rt].lz;        q[id][rt].lz = -1;    }}int qqurry(int l,int r,int rt,int id){    //printf("rt = %d    l = %d    r = %d    mid = %d    ll = %d    rr = %d\n",rt,l,r,q[id][rt].mid,q[id][rt].l,q[id][rt].r);    if(q[id][rt].l == l && q[id][rt].r == r)    {        return q[id][rt].ans;    }    push_down(rt,id);    if(r<=q[id][rt].mid)    {        return qqurry(l,r,rt<<1,id);    }    if(l>=q[id][rt].mid)    {        return qqurry(l,r,rt<<1|1,id);    }    return (qqurry(l,q[id][rt].mid,rt<<1,id) + qqurry(q[id][rt].mid,r,rt<<1|1,id));}void updata(int l,int r,int rt,int pp,int id){    if(q[id][rt].l == l && q[id][rt].r == r)    {        q[id][rt].ans = (q[id][rt].r - q[id][rt].l)*pp;        q[id][rt].lz = pp;        return ;    }    push_down(rt,id);    if(r<=q[id][rt].mid)    {        updata(l,r,rt<<1,pp,id);    }    else if(l>=q[id][rt].mid)    {        updata(l,r,rt<<1|1,pp,id);    }    else    {        updata(l,q[id][rt].mid,rt<<1,pp,id);        updata(q[id][rt].mid,r,rt<<1|1,pp,id);    }    q[id][rt].ans = q[id][rt<<1].ans + q[id][rt<<1|1].ans;}int main(){    while(scanf("%d%d",&n,&m)!=EOF)    {        scanf("%s",str);        for(int i=0;i<26;i++)        {            build(1,n+1,1,i);        }        int x,y,k;        while(m--)        {            scanf("%d%d%d",&x,&y,&k);            for(int i=0;i<26;i++)            {                num[i] = qqurry(x,y+1,1,i);                updata(x,y+1,1,0,i);            }            if(k == 1)            {                int cnt = x;                for(int i=0;i<26;i++)                {                    if(num[i]>0)                    {                        updata(cnt,cnt+num[i],1,1,i);                    }                    cnt += num[i];                }            }            else if(k == 0)            {                int cnt = x;                for(int i=25;i>=0;i--)                {                    if(num[i]>0)                    {                        updata(cnt,cnt+num[i],1,1,i);                    }                    cnt += num[i];                }            }        }        for(int i=1;i<=n;i++)        {            for(int j=0;j<26;j++)            {                if(qqurry(i,i+1,1,j))                {                    ss[i-1] = 'a' + j;                    break;                }            }        }        printf("%s\n",ss);    }    return 0;}


0 0