cf A Simple Task---线段树
Examples
10 5
abacdabcda
7 10 0
5 8 1
1 4 0
3 6 0
7 10 1
cbcaaaabdd
10 1
agjucbvdfk
1 10 1
abcdfgjkuv
题意:给定一个字符串,长度为n,q次操作,对于每次操作,但flag为1时,l——r为非减序列,当flag为0时,l——r为非增序列。
输出q次操作后的字符串。
思路:考虑记数排序,这样时间复杂度为26nlogn。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
#define M 100000+10 int bj[M],k[M],sum[*M],lazy[*M];
char s[M];
char z[M];
struct node
{
int l,r,flag;
} b[M];
void build(int i,int l,int r)//建树
{
lazy[i]=-;
if(l==r)
{
sum[i]=k[l];
return ;
}
int mid=(l+r)>>;
build(i*,l,mid);
build(+i*,mid+,r);
sum[i]=sum[i*]+sum[+i*];
}
void pushdown(int i,int l,int r)//lazy下推
{
if(lazy[i]==-)
return ;
int mid=(l+r)>>;
lazy[i*]=lazy[+i*]=lazy[i];
sum[i*]=(mid-l+)*lazy[i];
sum[+i*]=(r-mid)*lazy[i];
lazy[i]=-;
return ;
} int query1(int i,int l,int r,int x,int y)//查询区间和
{
if(l>=x&&r<=y)
{
return sum[i];
}
pushdown(i,l,r);
int mid=(l+r)>>;
int ans=;
if(mid>=x)ans+=query1(i*,l,mid,x,y);
if(mid<y)ans+=query1(i*+,mid+,r,x,y);
sum[i]=sum[i*]+sum[+i*];
return ans;
}
void add(int i,int l,int r,int x,int y,int num)//修改区间
{
if(l>=x&&r<=y)
{
lazy[i]=num;
sum[i]=(r-l+)*num;
return;
}
int mid=(l+r)>>;
pushdown(i,l,r);
if(mid>=x)add(i*,l,mid,x,y,num);
if(mid<y)add(+i*,mid+,r,x,y,num);
sum[i]=sum[i*]+sum[i*+];
} int main()
{ int n,q;
cin>>n>>q;
for(int i=; i<=n; i++)
z[i]='/';
scanf("%s",s+);
for(int i=; i<q; i++)
cin>>b[i].l>>b[i].r>>b[i].flag;
for(int i=; i<; i++) //分别对a,b,c,....z排序
{
char x='a'+i;
for(int j=; j<=n; j++)
if(x==s[j])
bj[j]=;
for(int j=; j<=n; j++)
k[j]=bj[j];
memset(sum,,sizeof(sum));
build(,,n);
for(int j=; j<q; j++)
{
int num=query1(,,n,b[j].l,b[j].r);
if(b[j].flag==)
{
if(num!=)
add(,,n,b[j].l,b[j].l+num-,);
if(b[j].r-b[j].l+!=num)
add(,,n,b[j].l+num,b[j].r,);
}
else
{
if(num!=)
add(,,n,b[j].r-num+,b[j].r,);
if(b[j].r-b[j].l+!=num)
add(,,n,b[j].l,b[j].r-num,);
}
}
for(int j=; j<=n; j++)
{
int x1=query1(,,n,j,j);
if(x1==)
if(z[j]=='/')
z[j]='a'+i;
}
}
for(int i=; i<=n; i++)
printf("%c",z[i]);
puts("");
return ;
}
cf A Simple Task---线段树的更多相关文章
- CF #312 E. A Simple Task 线段树
题目链接:http://codeforces.com/problemset/problem/558/E 给一个字符串,每次对一个区间内的子串进行升序或者降序的排列,问最后字符串什么样子. 对于字符串排 ...
- Codeforces Round #312 (Div. 2) E. A Simple Task 线段树
E. A Simple Task 题目连接: http://www.codeforces.com/contest/558/problem/E Description This task is very ...
- Codeforces Round #312 (Div. 2) E. A Simple Task 线段树+计数排序
题目链接: http://codeforces.com/problemset/problem/558/E E. A Simple Task time limit per test5 secondsme ...
- CodeForces 588E A Simple Task(线段树)
This task is very simple. Given a string S of length n and q queries each query is on the format i j ...
- Codeforces Round #312 (Div. 2) E. A Simple Task 线段树 延时标记
E. A Simple Task time limit per test5 seconds memory limit per test512 megabytes inputstandard input ...
- Codeforces 588E. A Simple Task (线段树+计数排序思想)
题目链接:http://codeforces.com/contest/558/problem/E 题意:有一串字符串,有两个操作:1操作是将l到r的字符串升序排序,0操作是降序排序. 题解:建立26棵 ...
- CF558E A simple task 线段树
这道题好猥琐啊啊啊啊啊啊 写了一个上午啊啊啊啊 没有在update里写pushup啊啊啊啊 题目大意: 给你一个字符串s,有q个操作 l r 1 :把sl..rsl..r按升序排序 l r 0 :把s ...
- codeforces 558E A Simple Task 线段树
题目链接 题意较为简单. 思路: 由于仅仅有26个字母,所以用26棵线段树维护就好了,比較easy. #include <iostream> #include <string> ...
- [Codeforces558E]A Simple Task 线段树
链接 题意:给定一个长度不超过 \(10^5\) 的字符串(小写英文字母),和不超过5000个操作. 每个操作 L R K 表示给区间[L,R]的字符串排序,K=1为升序,K=0为降序. 最后输出最终 ...
- CF 1023D Array Restoration - 线段树
题解 非常容易想到的线段树, 还可以用并查集来. 还有一位大神用了$O(n)$ 就过了Orz 要判断是否能染色出输入给出的序列,必须满足两个条件: 1. 序列中必须存在一个$q$ 2. 两个相同的数$ ...
随机推荐
- 第 10 章 容器监控 - 081 - Weave Scope 多主机监控
除了监控容器,Weave Scope 还可以监控 Docker Host 点击顶部 HOSTS 菜单项,地图将显示当前 host. 与容器类似,点击该 host 图标将显示详细信息 host 当前的资 ...
- Spring Boot 返回 JSON 数据,一分钟搞定!
如何返回 JSON 数据? 在 Spring Boot 中返回 JSON 数据很简单,如下几步. 加入依赖 12345678910 <parent> <groupId>org. ...
- SpringBoot之profile详解
SpringBoot中使用配置文件application.properties&application.yml两种方式,在这两种方式下分别对应各自的profile配置方式,同时还存在命令行.虚 ...
- 理解不为人知的ClassLoader
JAVA类装载方式,有两种: 1.隐式装载, 程序在运行过程中当碰到通过new 等方式生成对象时,隐式调用类装载器加载对应的类到jvm中. 2.显式装载, 通过class.forname()等方法,显 ...
- Headless Service 和Service
定于spec:clusterIP: None 还记得Service的Cluster IP是做什么的吗?对,一个Service可能对应多个EndPoint(Pod),client访问的是Cluster ...
- SQLyog 连接主机的时候出现错误
这个 连接主机的时候出现: 这个时候打开cmd 找到mysql 的bin目录 输入 mysqld -nt -remove 即可 直接登录,注意这里的d代表的是服务端 接下来就可以不用输入密码直 ...
- VMware下Debian开发环境部署之常见问题记录
本文讲介绍windows作为宿主机,linux虚拟机作为编译环境的开发环境搭建中最常用到的三个问题,详细描述了解决过程. 目录: 1.网路配置: 2.分辨率设置: 3.共享网盘设置: 1.网络设置,V ...
- iframe的缺点
*iframe会阻塞主页面的Onload事件: *搜索引擎的检索程序无法解读这种页面,不利于SEO; *iframe和主页面共享连接池,而浏览器对相同域的连接有限制,所以会影响页面的并行加载. 使用i ...
- [Oracle][DATAGUARD] 关于确认LOGICAL STANDBY的同期状况的方法
Oracle的DATAGUARD环境,有PHYSICAL STANDBY和LOGICAL STANDBY两种.PHYSICAL STANDBY是传输REDO传到Standby端,然后由Standby端 ...
- Python2.0 与 3.0 的区别
Python 2.0 =默认编码=ASSIC=不支持中文 Python 3.0 =默认编码=UNICODE=默认支持中文 In summary : Python 2.x is legacy, Py ...
