一个由26字母组成的字符串 每次对一个区间内的子串升序或降序排序 如果以字符串为基础建立线段树 真的是毫无头绪(或许这就是所谓的不满足区间加法吧) 但是26个字母很少 对每一个字母建立线段树是可行的 并且排序也可以考虑用基础排序来实现 这样时间空间都满足
#include <bits/stdc++.h>
using namespace std;
struct node
{
int l;
int r;
int val;
int laz;
};
node tree[26][400010];
char ch[100010];
int n;
void pushup(int id,int cur)
{
tree[id][cur].val=tree[id][2*cur].val+tree[id][2*cur+1].val;
return;
}
void pushdown(int id,int cur)
{
if(tree[id][cur].laz!=-1)
{
tree[id][2*cur].val=(tree[id][2*cur].r-tree[id][2*cur].l+1)*tree[id][cur].laz;
tree[id][2*cur].laz=tree[id][cur].laz;
tree[id][2*cur+1].val=(tree[id][2*cur+1].r-tree[id][2*cur+1].l+1)*tree[id][cur].laz;
tree[id][2*cur+1].laz=tree[id][cur].laz;
tree[id][cur].laz=-1;
}
return;
}
void build(int l,int r,int id,int cur)
{
int m;
tree[id][cur].l=l;
tree[id][cur].r=r;
tree[id][cur].val=0;
tree[id][cur].laz=-1;
if(l==r) return;
m=(l+r)/2;
build(l,m,id,2*cur);
build(m+1,r,id,2*cur+1);
return;
}
void update(int pl,int pr,int val,int id,int cur)
{
if(pl<=tree[id][cur].l&&tree[id][cur].r<=pr)
{
tree[id][cur].val=(tree[id][cur].r-tree[id][cur].l+1)*val;
tree[id][cur].laz=val;
return;
}
pushdown(id,cur);
if(pl<=tree[id][2*cur].r) update(pl,pr,val,id,2*cur);
if(pr>=tree[id][2*cur+1].l) update(pl,pr,val,id,2*cur+1);
pushup(id,cur);
return;
}
int query(int pl,int pr,int id,int cur)
{
int res;
if(pl<=tree[id][cur].l&&tree[id][cur].r<=pr)
{
return tree[id][cur].val;
}
pushdown(id,cur);
res=0;
if(pl<=tree[id][2*cur].r) res+=query(pl,pr,id,2*cur);
if(pr>=tree[id][2*cur+1].l) res+=query(pl,pr,id,2*cur+1);
return res;
}
int main()
{
int book[26];
int q,i,j,l,r,op;
while(scanf("%d%d",&n,&q)!=EOF)
{
scanf("%s",ch);
for(i=0;i<26;i++)
{
build(1,n,i,1);
}
for(i=0;i<n;i++)
{
update(i+1,i+1,1,ch[i]-'a',1);
}
while(q--)
{
scanf("%d%d%d",&l,&r,&op);
memset(book,0,sizeof(book));
for(i=0;i<26;i++)
{
book[i]=query(l,r,i,1);
}
for(i=0;i<26;i++)
{
update(l,r,0,i,1);
}
if(op)
{
for(i=0;i<26;i++)
{
if(book[i]!=0)
{
update(l,l+book[i]-1,1,i,1);
l+=book[i];
}
}
}
else
{
for(i=25;i>=0;i--)
{
if(book[i]!=0)
{
update(l,l+book[i]-1,1,i,1);
l+=book[i];
}
}
}
}
for(i=0;i<n;i++)
{
for(j=0;j<26;j++)
{
if(query(i+1,i+1,j,1))
{
ch[i]='a'+j;
break;
}
}
}
printf("%s\n",ch);
}
return 0;
}