Codeforces 558E A Simple Task
题意:给定一个字符串,以及m次操作,每次操作对字符串的一个子区间进行升序或降序排序,求m次操作后的串
考虑桶排,发现线段树可以模拟桶排的过程,所以对26个字母分别建立线段树即可
#include<bits/stdc++.h>
using namespace std;
#define MAXN 1000000+10
struct tree{int sum,tag;}tr[MAXN*][];
char s[MAXN];
int n,m,cnt[];
void pushup(int k,int x){tr[k][x].sum=tr[k<<][x].sum+tr[k<<|][x].sum;}
void pushdown(int k,int x,int l,int r){
int mid=(l+r)>>;
if(tr[k][x].tag==){
tr[k<<][x].sum=(mid-l+);tr[k<<|][x].sum=(r-mid);
tr[k<<][x].tag=tr[k<<|][x].tag=;
tr[k][x].tag=;
}
else if(tr[k][x].tag==){
tr[k<<][x].sum=tr[k<<|][x].sum=;
tr[k<<][x].tag=tr[k<<|][x].tag=;
tr[k][x].tag=;
}
}
void build(int k,int l,int r,int x){
tr[k][x].tag=;
if(l==r){
tr[k][x].sum=;
return;
}
int mid=(l+r)>>;
build(k<<,l,mid,x);
build(k<<|,mid+,r,x);
pushup(k,x);
}
void update(int k,int l,int r,int L,int R,int val,int x){
if(l>=L&&r<=R){
if(val==)tr[k][x].sum=r-l+;
else tr[k][x].sum=;
tr[k][x].tag=val;
return;
}
pushdown(k,x,l,r);
int mid=(l+r)>>;
if(R<=mid)update(k<<,l,mid,L,R,val,x);
else if(L>mid)update(k<<|,mid+,r,L,R,val,x);
else update(k<<,l,mid,L,R,val,x),update(k<<|,mid+,r,L,R,val,x);
pushup(k,x);
}
int query(int k,int l,int r,int L,int R,int x){
if(l>=L&&r<=R)return tr[k][x].sum;
pushdown(k,x,l,r);
int mid=(l+r)>>;
if(R<=mid)return query(k<<,l,mid,L,R,x);
else if(L>mid)return query(k<<|,mid+,r,L,R,x);
else return query(k<<,l,mid,L,R,x)+query(k<<|,mid+,r,L,R,x);
pushup(k,x);
}
int main(){
scanf("%d%d",&n,&m);
scanf("%s",s+);
for(int i=;i<;i++)build(,,n,i);
for(int i=;i<=n;i++)update(,,n,i,i,,s[i]-'a');
while(m--){
memset(cnt,,sizeof(cnt));
int l,r,x;
scanf("%d%d%d",&l,&r,&x);
for(int i=;i<;i++){
cnt[i]=query(,,n,l,r,i);
update(,,n,l,r,,i);
}
if(x){
int p=l;
for(int i=;i<;i++){
if(cnt[i])update(,,n,p,p+cnt[i]-,,i);
p+=cnt[i];
}
}
else{
int p=l;
for(int i=;i>=;i--){
if(cnt[i])update(,,n,p,p+cnt[i]-,,i);
p+=cnt[i];
}
}
}
for(int i=;i<=n;i++){
for(int k=;k<;k++)
if(query(,,n,i,i,k)){
putchar((char)k+'a');
break;
}
}
return ;
}
Codeforces 558E A Simple Task的更多相关文章
- 计数排序 + 线段树优化 --- Codeforces 558E : A Simple Task
E. A Simple Task Problem's Link: http://codeforces.com/problemset/problem/558/E Mean: 给定一个字符串,有q次操作, ...
- Codeforces 558E A Simple Task (计数排序&&线段树优化)
题目链接:http://codeforces.com/contest/558/problem/E E. A Simple Task time limit per test5 seconds memor ...
- Codeforces 558E A Simple Task(权值线段树)
题目链接 A Simple Task 题意 给出一个小写字母序列和若干操作.每个操作为对给定区间进行升序排序或降序排序. 考虑权值线段树. 建立26棵权值线段树.每次操作的时候先把26棵线段树上的 ...
- Codeforces 558E A Simple Task(计数排序+线段树优化)
http://codeforces.com/problemset/problem/558/E Examples input 1 abacdabcda output 1 cbcaaaabdd input ...
- codeforces 558E A Simple Task 线段树
题目链接 题意较为简单. 思路: 由于仅仅有26个字母,所以用26棵线段树维护就好了,比較easy. #include <iostream> #include <string> ...
- Codeforces C. A Simple Task(状态压缩dp)
题目描述: A Simple Task time limit per test 2 seconds memory limit per test 256 megabytes input standar ...
- 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 J. A Simple Task(多棵线段树)
题目描述: Description This task is very simple. Given a string S of length n and q queries each query is ...
- Codeforces 588E. A Simple Task (线段树+计数排序思想)
题目链接:http://codeforces.com/contest/558/problem/E 题意:有一串字符串,有两个操作:1操作是将l到r的字符串升序排序,0操作是降序排序. 题解:建立26棵 ...
随机推荐
- SQL Server本地连接不上
1.打开SQL Server 2014配置管理器 2.启动服务
- <template> 标签
<template> 元素,用于描述一个标准的以 DOM 为基础的方案来实现客户端模板.该模板允许你定义一段可以被转为 HTML 的标记,在页面加载时不生效,但可以在后续进行动态实例化.( ...
- java 猜系统获取的随机数
int randomNumber=(int)(Math.random()*8)+1; 注释是:得到一个1到8之间的随机整数. /************************************ ...
- Scrum Meeting Alpha - 1 (团队任务分解)
团队任务分解 Alpha阶段项目目标 实现一个博客园班级博客的Android 客户端: 实现班级博客的常用功能(不包括投票.公告.校区) 有一个较为简洁美观.操作方便的界面 添加消息提醒功能. 任务拆 ...
- 前后端分手大师——MVVM 模式
之前对 MVVM 模式一直只是模模糊糊的认识,正所谓没有实践就没有发言权,通过这两年对 Vue 框架的深入学习和项目实践,终于可以装B了有了拨开云雾见月明的感觉. 简而言之 Model–View–Vi ...
- javaScript额外笔记
--------------------------------------------------------Part 1javascript:脚本语言辅助开发:网页的前台开发三大块:1.HTML ...
- [转]开源框架完美组合之Spring.NET + NHibernate + ASP.NET MVC + jQuery + easyUI 中英文双语言小型企业网站Demo
热衷于开源框架探索的我发现ASP.NET MVC与jQuery easyUI的组合很给力.由于原先一直受Ext JS框架的licence所苦恼,于是痛下决心寻找一个完全免费的js框架——easyUI. ...
- linux 安装nginx 详解
1 nginx安装环境 nginx是C语言开发,建议在linux上运行,本教程使用Centos6.5作为安装环境. n gcc 安装nginx需要先将官网下载的源码进行编译,编译依赖gcc环境,如果没 ...
- Chapter 7:Linking
概述: 在linux上,从c源码到可执行文件主要需要经历translator(compiler.assembler)生成object file,再经由linker连接成executable objec ...
- 学习java的优势
学习java之后,到企业的岗位 技术:java软件开发工程师(中初级):技术一般: 高级工程师:技术高等: 技术架构师:技术顶级: 管理:项目经理:产品经理: 质询:质询顾问:销售经理: 学会之后可以 ...