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. 两个相同的数$ ...
随机推荐
- Python生产者producer和consumer消费者案例写法,含有多线程,包含队列queue、JoinableQueue队列的用法
import timeimport random import queuefrom multiprocessing import Process,Queue 案例一:def consumer(q,na ...
- Windows server2008服务器设置多用户登录
添加用户 右击我的电脑-->管理-->本地用户和组-->新用户 启用远程服务并添加远程用户 启用 右键我的电脑--->属性--->远程设置--->勾上允许远程连接到 ...
- Python —— 函数高级特性(切片、迭代、列表生成式、生成器、迭代器)
一.切片(Slice) 在很多编程语言中,针对字符串提供了很多截取函数(i.e. substring),目的就是对字符串切片.python中没有针对字符串的截取函数,需要通过“切片”来完成. 取一个 ...
- java 分布式id生成算法
import java.lang.management.ManagementFactory; import java.net.InetAddress; import java.net.NetworkI ...
- VueJs 自定义过滤器使用总结
过滤器是一个通过输入数据,能够及时对数据进行处理并返回一个数据结果的简单函数.Vue有很多很便利的过滤器,可以参考官方文档, http://cn.vuejs.org/api/#过滤器 ,过滤器通常会使 ...
- STRANS一:简单的XML转换
心情不好,泥总把表妹微信给冰冰了,心塞... 1.简单的单层结构: <?sap.transform simple?> <tt:transform xmlns:tt="htt ...
- qtp type和set方法的区别
type模拟键盘输入,是一个字符一个字符的输入. set是整个输入框一起置值. 例如:winedit中输入a后,再用type输入b,结果就是ab 如果用set输入a后,再用set输入b,结果就是b. ...
- Vue.js安装使用教程
一.说明 上大学前,请的都是前端JavaScript.后端ASP/PHP/JSP.前后端代码混杂:上大学时,请的都是前端Jquery.后端SSH.前后端代码分离通过模板关联:大学出来后,请的都是前端三 ...
- Maximum Sum of Digits(CodeForces 1060B)
Description You are given a positive integer nn. Let S(x) be sum of digits in base 10 representation ...
- openjudge真的慢啊
€openjudge真的慢啊
