给出长度为n的字符串,m个操作。

每一个操作有三个值 l,r,op。

op==1,表示将字符串中[ l ,r ]的部分依照升序排列。

op==0,表示将字符串中[ l ,r ]的部分依照降序排列。

输出终于的字符串

按小写字母建26颗线段树

对于每次改动,先记录[l,r]区间内各个字母出现的次数,并对对应区间清空,然后依照升序或者降序从新更新

#include "stdio.h"
#include "string.h" char str[100010];
int n,temp;
struct node
{
int l,r,x,lazy;
}data[30][400010];
void build(int l,int r,int k,int op)
{
int mid;
data[op][k].l=l;
data[op][k].r=r;
data[op][k].x=0;
data[op][k].lazy=-1;
if (l==r)
return ; mid=(l+r)/2;
build(l,mid,k*2,op);
build(mid+1,r,k*2+1,op);
} void Pushdown(int k,int op)
{
if (data[op][k].lazy==-1) return ;
if (data[op][k].l==data[op][k].r) return ; if (data[op][k].lazy==0)
{
data[op][k*2].x=data[op][k*2].lazy=0;
data[op][k*2+1].x=data[op][k*2+1].lazy=0;
}
else
{
data[op][k*2].x=data[op][k*2].r-data[op][k*2].l+1;
data[op][k*2+1].x=data[op][k*2+1].r-data[op][k*2+1].l+1;
data[op][k*2].lazy=data[op][k*2+1].lazy=1;
}
data[op][k].lazy=-1; } void updata(int l,int r,int k,int op)
{
int mid;
if (data[op][k].l==l && data[op][k].r==r)
{
data[op][k].x=data[op][k].r-data[op][k].l+1;
data[op][k].lazy=1;
return;
} Pushdown(k,op); mid=(data[op][k].l+data[op][k].r)/2; if (r<=mid) updata(l,r,k*2,op);
else
if (l>mid) updata(l,r,k*2+1,op);
else
{
updata(l,mid,k*2,op);
updata(mid+1,r,k*2+1,op);
} data[op][k].x=data[op][k*2].x+data[op][k*2+1].x; } void search(int l,int r,int k,int op)
{
int mid;
if (data[op][k].l==l && data[op][k].r==r)
{
temp+=data[op][k].x;
data[op][k].x=0;
data[op][k].lazy=0;
return ;
} Pushdown(k,op); mid=(data[op][k].l+data[op][k].r)/2; if (r<=mid) search(l,r,k*2,op);
else if (l>mid) search(l,r,k*2+1,op);
else
{
search(l,mid,k*2,op);
search(mid+1,r,k*2+1,op);
} data[op][k].x=data[op][k*2].x+data[op][k*2+1].x;
}
void init()
{
int i;
scanf("%s",str);
for (i=0;i<26;i++)
build(1,n,1,i);
for (i=0;i<n;i++)
updata(i+1,i+1,1,str[i]-'a');
}
int main()
{
int m,a,b,c,i,j,k;
int mark[30];
while (scanf("%d%d",&n,&m)!=EOF)
{
init(); while (m--)
{
scanf("%d%d%d",&a,&b,&c);
memset(mark,0,sizeof(mark));
for (i=0;i<26;i++)
{
temp=0;
search(a,b,1,i); // 查找区间内i字母出现的次数,并清空
mark[i]+=temp;
}
if (c==0)
{
k=a;
for (i=25;i>=0;i--)
if (mark[i]!=0)
{
updata(k,k+mark[i]-1,1,i); // 更新区间字母
k+=mark[i];
}
}
else
{
k=a;
for (i=0;i<26;i++)
if (mark[i]!=0)
{
updata(k,k+mark[i]-1,1,i);
k+=mark[i]; }
}
}
for (i=1;i<=n;i++)
{
for (j=0;j<26;j++)
{
temp=0;
search(i,i,1,j);
if (temp!=0)
{
printf("%c",j+'a');
break;
}
}
}
printf("\n");
}
return 0;
}

最新文章

  1. 滤镜 filter:gray 变灰色
  2. nginx 配置优化(简单)
  3. PHP API接口测试小工具
  4. BZOJ1077 : [SCOI2008]天平
  5. 理解运算符 || 和 &amp;&amp; 及方法
  6. C# app.config文件配置和修改
  7. PHP学习笔记,curl,file_get_content,include和fopen四种方法获取远程文件速度测试.
  8. Spring boot 启动过程解析 logback
  9. Android binder学习一:主要概念
  10. 强化学习(九)Deep Q-Learning进阶之Nature DQN
  11. GitHub项目功能理解
  12. SqlSugar ORM 的学习
  13. 安卓学习 intent
  14. Java对象的克隆和深浅问题
  15. 纯中文C++代码,可运行
  16. 薛兆丰吴军何帆曾鸣万维刚李笑来罗永浩等得到APP专栏作者的书23本
  17. 05-spark streaming &amp; kafka
  18. [ 9.12 ]CF每日一题系列—— 960B暴力数组
  19. Oracle 之 保留两位小数
  20. iOS - 获取安装所有App的Bundle ID

热门文章

  1. multiple definition of
  2. 3.如何构建Cython代码
  3. 五大最佳开源java性能监控工具
  4. 洛谷 P2393 yyy loves Maths II
  5. HDU 4321 Contest 3
  6. UltraEdit正則表達式介绍及实例
  7. HDU1061_Rightmost Digit【高速幂取余】
  8. Yocto tips (19): Yocto SDK Toolchian的使用
  9. 根据数据表自动生成javaBean
  10. hdoj 2222 Keywords Search 【AC自己主动机 入门题】 【求目标串中出现了几个模式串】