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. 两个相同的数$ ...
随机推荐
- es6 Promise简单介绍
promise的基本用法 promise执行多步操作非常好用,那我们就来模仿一个多步操作的过程,那就以吃饭为例吧.要想在家吃顿饭,是要经过三个步骤的. 洗菜做饭. 坐下来吃饭. 收拾桌子洗碗. 这个过 ...
- iOS权限申请
<!-- 相册 --> <key>NSPhotoLibraryUsageDescription</key> <string>App需要您的同意,才能访问 ...
- Spring Boot属性文件配置文档(全部)
This sample file is meant as a guide only. Do not copy/paste the entire content into your applicatio ...
- L - Non-Prime Factors (质数筛选+因子分解)
In many programming competitions, we are asked to find (or count the number of) Prime Factors of an ...
- Flex4之皮肤定制
Flex4之皮肤定制[Skin类和Skin类] 博客分类: RIA-Flex4专栏 FlexAdobeUPFlashUI 第一.关于spark.skin.SparkSkin类的 1. ...
- 『Python』为什么调用函数会令引用计数+2
一.问题描述 Python中的垃圾回收是以引用计数为主,分代收集为辅,引用计数的缺陷是循环引用的问题.在Python中,如果一个对象的引用数为0,Python虚拟机就会回收这个对象的内存. sys.g ...
- shell脚本 快照还原Hbase数据库
#!/bin/bash for i in $(cat ./hbaseTable);do echo "disable '$i'" | hbase shellecho "re ...
- PAT 1124 Raffle for Weibo Followers
1124 Raffle for Weibo Followers (20 分) John got a full mark on PAT. He was so happy that he decide ...
- 关于Jmeter的简单认识
Jmeter初识 Apache Jmeter概述 是100%的纯java桌面应用,用于压力测试与功能测试,它开始被设计用于web应用测试,后来扩展到其他测试领域,通过线程租来驱动多个线程运行测试脚本, ...
- vue-cli中怎么样使用less
1.安装安装less依赖,npm install less less-loader --save 2.修改配置文件, 在build/webpack.base.conf.js文件的module.expo ...
