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