Codeforces 558E 线段树处理字符串内排序
给出长度为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;
}
Codeforces 558E 线段树处理字符串内排序的更多相关文章
- Bash and a Tough Math Puzzle CodeForces 914D 线段树+gcd数论
Bash and a Tough Math Puzzle CodeForces 914D 线段树+gcd数论 题意 给你一段数,然后小明去猜某一区间内的gcd,这里不一定是准确值,如果在这个区间内改变 ...
- Codeforces Round #424 (Div. 2, rated, based on VK Cup Finals) Problem E (Codeforces 831E) - 线段树 - 树状数组
Vasily has a deck of cards consisting of n cards. There is an integer on each of the cards, this int ...
- cf580E. Kefa and Watch(线段树维护字符串hash)
题意 $n$个数的序列,$m + k$种操作 1.$l , r, k$把$l - r$赋值为$k$ 2.$l, r, d$询问$l - r$是否有长度为$d$的循环节 Sol 首先有个神仙结论:若询问 ...
- Codeforces 750E 线段树DP
题意:给你一个字符串,有两种操作:1:把某个位置的字符改变.2:询问l到r的子串最少需要删除多少个字符,使得这个子串含有2017子序列,并且没有2016子序列? 思路:线段树上DP,我们设状态0, 1 ...
- Codeforces 938G 线段树分治 线性基 可撤销并查集
Codeforces 938G Shortest Path Queries 一张连通图,三种操作 1.给x和y之间加上边权为d的边,保证不会产生重边 2.删除x和y之间的边,保证此边之前存在 3.询问 ...
- codeforces 1136E 线段树
codeforces 1136E: 题意:给你一个长度为n的序列a和长度为n-1的序列k,序列a在任何时候都满足如下性质,a[i+1]>=ai+ki,如果更新后a[i+1]<ai+ki了, ...
- Z - New Year Tree CodeForces - 620E 线段树 区间种类 bitset
Z - New Year Tree CodeForces - 620E 这个题目还没有写,先想想思路,我觉得这个题目应该可以用bitset, 首先这个肯定是用dfs序把这个树转化成线段树,也就是二叉树 ...
- D - The Bakery CodeForces - 834D 线段树优化dp···
D - The Bakery CodeForces - 834D 这个题目好难啊,我理解了好久,都没有怎么理解好, 这种线段树优化dp,感觉还是很难的. 直接说思路吧,说不清楚就看代码吧. 这个题目转 ...
- B - Legacy CodeForces - 787D 线段树优化建图+dij最短路 基本套路
B - Legacy CodeForces - 787D 这个题目开始看过去还是很简单的,就是一个最短路,但是这个最短路的建图没有那么简单,因为直接的普通建图边太多了,肯定会超时的,所以要用线段树来优 ...
随机推荐
- 大数据相关文档&Api下载
IT相关文档&Api下载(不断更新中) 下载地址:https://download.csdn.net/user/qq_42797237/uploads 如有没有你需要的API,可和我留言,留下 ...
- 第十一章 Servlet MVC模式
内包含案例,基于jsp+servlet的:MVC模式计算器:MVC模式登陆 第十一章 Servlet MVC模式 模型-视图-控制器(model-view-controller),简称MVC.MVC是 ...
- WinServer-IIS-js无法加载问题
IIS中无法加载JS文件错误 尝试下面的几种解决方法,一起用
- ASP.NET-常用插件集合
001.输入表单验证插件FluentValidation ( 这个组建可以直接验证实体类,达到和验证model相同的效果,如果类很少可以直接使用这个省去model) https://github.co ...
- Ruby print
Ruby print
- apache rewrite 正則表達式基础
用了好几次rewrite,用的次数不是非常多,每次都忘,都得又一次上网上找一堆现看,总结一下,以免以后忘了 =====================分隔符===================== ...
- USACO runaround
/* ID:kevin_s1 PROG:runround LANG:C++ */ #include <iostream> #include <cstdio> #include ...
- DevExpress TreeList控件的复选框
作者:jiankunking 出处:http://blog.csdn.net/jiankunking TreeList控件能够同一时候显示树结构和其它数据列,即在一个列上建立父子关系展开或收缩,同一时 ...
- UVA 11077 Find the Permutations 递推置换
Find the Permutations Sorting is one of the most used operations in real ...
- TCP、HTTP协议的RPC
TCP.HTTP协议的RPC 1.1 基于TCP协议的RPC 1.1.1 RPC名词解释 RPC的全称是Remote Process Call,即远程过程调用,RPC的实现包括客户端和服务端,即服务调 ...